【问题标题】:P/invoke DLL functions from C++ dll in C#在 C# 中从 C++ dll P/invoke DLL 函数
【发布时间】: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,因此我们非常感谢您的帮助。

【问题讨论】:

    标签: c# c++ .net dll pinvoke


    【解决方案1】:

    来自非托管来源:

    #define CALL_METHOD __stdcall
    

    并且来自托管源:

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

    您的调用约定不匹配。


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

    【讨论】:

    • 还是没有运气......The runtime has encountered a fatal error. The address of the error was at 0x6fda02c7, on thread 0x2e44. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.
    • 这是一个不同的错误。我不热衷于调试你的整个程序。但是,我可以告诉你,你的 C# 结构翻译是错误的。您未能正确翻译任何数组。您将需要UnmanagedType.ByValArray。请记住,您的问题不包括代码,并且非常具体地询问堆栈不平衡错误。
    • 我想我已经回答了您提出的两个问题。严格来说,我们喜欢在这里一次提出一个问题。
    猜你喜欢
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多