VB.NET中如何为Declare语句添加CallingConvention属性调用DLL?
把VB.NET的DllImport转换为VB6风格的Declare语句
嘿,这事儿不难!我来给你拆解两种写法的对应关系,直接转成Declare的旧写法,再讲清楚每个部分怎么匹配。
首先得明确:Declare是VB时代的老语法,不需要导入System.Runtime.InteropServices命名空间,语法更紧凑,直接把DLL信息、入口点、调用约定都整合在一行里。
核心对应关系
两者的关键参数是一一对应的,我给你列出来:
- DLL文件名:
DllImport("library_name.dll")→Declare ... Lib "library_name.dll" - 入口点别名:
EntryPoint:="entry_point"→Alias "entry_point"(如果你的方法名和DLL里的入口点同名,Alias可以直接省略) - 调用约定:
CallingConvention:=CallingConvention.Cdecl→ 直接在参数列表前加Cdecl关键字(默认是StdCall,大多数Windows API用这个,所以如果是StdCall可以不写) - 函数签名:返回值、参数列表完全和DllImport里的函数一致
示例转换
你原来的DllImport代码:
Imports System.Runtime.InteropServices <DllImport("library_name.dll", EntryPoint:="entry_point", CallingConvention:=CallingConvention.Cdecl)> Public Function method_name(...) AS ... End Function
转换成Declare语句就是这样:
' 推荐放在Module模块里(类中使用Declare需要加Shared,但模块是更传统的用法) Declare Public Function method_name Lib "library_name.dll" Alias "entry_point" (Cdecl, ...) As ...
额外注意点
- 如果是无返回值的Sub方法,把
Function换成Sub,去掉返回值部分即可:Declare Public Sub method_name Lib "library_name.dll" Alias "entry_point" (Cdecl, ...) - Declare默认是Public访问权限,如果你需要私有调用,改成
Private就行 - 要是调用约定是默认的
StdCall,可以直接去掉Cdecl关键字
这样写出来的Declare语句,功能和你原来的DllImport完全一致!
内容的提问来源于stack exchange,提问作者omg




