C# 从C+调用DLL函数+;C语言中的动态链接库#
我在调用DLL(某些相机的SDK)中的一些函数时遇到问题。在.dll的源代码中,有一个函数:C# 从C+调用DLL函数+;C语言中的动态链接库#,c#,c++,.net,dll,pinvoke,C#,C++,.net,Dll,Pinvoke,我在调用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[
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签名匹配的调用约定和参数
目标非托管签名
这很好,但我没有别的东西。我尝试了十几种解决方案,但一无所获
是dll和.Net应用程序的源。谢谢
[编辑]
正如@david指出的,调用Convention是错误的,现在,我得到了以下错误:
运行时遇到致命错误。错误的地址
位于线程0x2554上的0x6fda02c7。错误代码为0xc0000005。
此错误可能是CLR或不安全或不可验证文件中的错误
部分用户代码。此错误的常见来源包括用户
COM互操作或PInvoke的封送处理错误,这可能会损坏
堆叠
这是来自DLL还是CLR(.Net)的错误?我从未将任何函数从DLL导入.Net,因此非常感谢您的帮助。来自非托管源:
#define CALL_METHOD __stdcall
[DllImport("DVR_NET_SDK.dll", CallingConvention = CallingConvention.Cdecl)]
从托管源:
#define CALL_METHOD __stdcall
[DllImport("DVR_NET_SDK.dll", CallingConvention = CallingConvention.Cdecl)]
您的呼叫约定不匹配
至于问题的编辑,这大概是因为C#结构定义与非托管结构不匹配。您未能正确转换任何数组。它们将需要使用
[marshallas(UnmanagedType.ByValArray,SizeConst=…)]
仍然不走运<代码>运行时遇到致命错误。错误地址位于线程0x2e44上的0x6fda02c7。错误代码为0xc0000005。此错误可能是CLR或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM interop或PInvoke的用户封送错误,这可能会损坏堆栈。这是另一个错误。我不想调试你的整个程序。但是,我可以告诉你,你的C#struct翻译是错误的。您未能正确转换任何数组。您将需要非托管类型.ByValArray
。请记住,您的问题不包括代码,并且非常具体地询问了堆栈不平衡错误。我想我已经回答了您提出的两个问题。严格地说,我们希望在这里一次有一个问题。