
[英]C# equivalent of VB DLL function declaration (InternetSetOption)?
[英]DLL function signature in VB
我需要从VB应用程序调用DLL函数。 该函数声明为
extern "C" __declspec(dllexport) int Average(HBITMAP SrcHandle, HBITMAP DstHandle)
DLL,它是用C ++编写的。
我可以在C#程序中使用声明无缝地调用它
[DllImport("Integrate.dll")]
public static extern int Average(IntPtr SrcHandle, IntPtr DstHandle);
然后在VB中尝试
Declare Function Average Lib "Integrate.dll" _
(ByVal SrcHandle As IntPtr, ByVal DstHandle As IntPtr) As Integer
这可以编译,但不幸的是,在运行时,我收到以下错误消息:
检测到PInvokeStackImbalance消息:对PInvoke函数'TestVB!WindowsApplication1.Form1 :: Average'的调用已使堆栈不平衡。 这可能是因为托管PInvoke签名与非托管目标签名不匹配。 检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。
我该如何解决?
问题是,通常情况下,调用约定不匹配。 C代码使用cdecl,VB代码使用stdcall。 导入函数时需要指定调用约定,这意味着需要p / invoke。
<DllImport("Integrate.dll", CallingConvention:=CallingConvention.Cdecl)> _
Public Shared Function Average(ByVal SrcHandle As IntPtr, _
ByVal DstHandle As IntPtr) As Integer
End Function
请注意,出于相同的原因,您的C#代码也是错误的。 它应该是:
[DllImport("Integrate.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int Average(IntPtr SrcHandle, IntPtr DstHandle);
我只能想象您的C#项目已禁用PInvokeStackImbalance MDA。
您也可以在VB.NET中使用DllImport
属性。 实际上,这是本机.NET的方法。 Declare
主要用于旧版本的VB中。
<DllImport("Integrate.dll")> _
Public Shared Function Average(ByVal SrcHandle As IntPtr, ByVal DstHandle As IntPtr) As Integer
End Function
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.