P/invoke DLL 函数从 C++ dll 在 C# 中

P/invoke DLL functions from C++ dll in C#

本文关键字:dll C++ invoke DLL 函数      更新时间:2023-10-16

我在从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 签名匹配的参数 目标非托管签名。

Init 通过得很好,但我无法得到其他任何东西。我尝试了十几种解决方案,但一无所获。

这是dll的来源和我的.Net应用程序的来源。 谢谢!

[编辑]

正如@david指出的那样,调用公约是错误的,现在,我得到以下错误:

运行时遇到致命错误。错误的地址 在0x6fda02c7,在线程0x2554。错误代码为0xc0000005。 此错误可能是 CLR 中的错误,也可能是不安全或不可验证的错误 部分用户代码。此错误的常见来源包括用户 COM 互操作或 PInvoke 的封送处理错误,这可能会损坏 叠。

此错误来自 DLL 还是 CLR (.Net)?我从未将任何函数从DLL导入.Net,因此非常感谢任何帮助。

从非托管源:

#define CALL_METHOD __stdcall

从托管源:

[DllImport("DVR_NET_SDK.dll", CallingConvention = CallingConvention.Cdecl)]

您的调用约定不匹配。


至于对问题的编辑,大概是因为 C# 结构定义与非托管结构不匹配。您未能正确转换任何数组。他们将需要使用[MarshalAs(UnmanagedType.ByValArray, SizeConst=...)].