【发布时间】:2015-03-17 11:50:35
【问题描述】:
我在调用 DLL(某些相机的 SDK)中的一些函数时遇到问题。在.dll的源码中,有函数:
NET_SDK_API LONG CALL_METHOD NET_SDK_Login(char *sDVRIP,WORD wDVRPort,char *sUserName,char *sPassword,LPNET_SDK_DEVICEINFO lpDeviceInfo);
我正在尝试使用以下代码从 .Net 控制台应用程序调用它:
[STAThread]
static void Main(string[] args)
{
long userid = 0;
_net_sdk_deviceinfo dinfo = new _net_sdk_deviceinfo();
short port = 6036;
try
{
if (DVR.NET_SDK_Init())
{
Console.WriteLine("ok");
userid = DVR.NET_SDK_Login("192.168.1.132", port, "admin", "123456", out dinfo);
userid.ToString();
}
else
{
Console.WriteLine("err");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.ReadKey();
}
我收到以下错误:
对 PInvoke 函数“DVRtest!DVRtest.DVR::NET_SDK_Login”的调用具有 堆栈不平衡。这可能是因为托管的 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数匹配 目标非托管签名。
初始化通过了,但我什么也得不到。我尝试了十几种解决方案,但无济于事。
Here 是我的 .Net 应用程序的 dll 和 source 的来源。谢谢!
[编辑]
正如@david 指出的那样,CallingConvention 是错误的,现在,我收到以下错误:
运行时遇到致命错误。错误的地址 位于线程 0x2554 上的 0x6fda02c7。错误代码为 0xc0000005。 此错误可能是 CLR 中的错误或不安全或不可验证的错误 部分用户代码。此错误的常见来源包括用户 COM-interop 或 PInvoke 的封送处理错误,这可能会损坏 堆栈。
这是来自 DLL 或 CLR (.Net) 的错误吗?我从未将任何函数从 DLL 导入到 .Net,因此我们非常感谢您的帮助。
【问题讨论】: