Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C+调用DLL函数+;C语言中的动态链接库#_C#_C++_.net_Dll_Pinvoke - Fatal编程技术网

C# 从C+调用DLL函数+;C语言中的动态链接库#

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[

我在调用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签名匹配的调用约定和参数 目标非托管签名

这很好,但我没有别的东西。我尝试了十几种解决方案,但一无所获

是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
。请记住,您的问题不包括代码,并且非常具体地询问了堆栈不平衡错误。我想我已经回答了您提出的两个问题。严格地说,我们希望在这里一次有一个问题。