在C#中加载非托管C ++。错误尝试读取或写入受保护的内存

时间:2012-11-20 04:57:39

标签: c++ visual-c++-2010

我有一个看起来像这样的C ++函数

    __declspec(dllexport) int ___stdcall RegisterPerson(char const * const szName)
    {
        std::string copyName( szName );
        // Assign name to a google protocol buffer object
        // Psuedo code follows..
        Protobuf::Person person;
        person.set_name(copyName);
        // Error Occurs here...
        std::cerr << person->DebugString() << std::endl;
    }

相应的C#代码如下所示......

    [DllImport(@"MyLibrary.dll", SetLastError = true)]
    public static unsafe extern int RegisterPerson([MarshalAs(UnmanagedType.LPTStr)]string szName)

不确定为什么这不起作用。我的C ++库被编译为具有MultiByte编码的多线程DLL。

任何帮助将不胜感激。我看到这是一个在线的常见问题,但没有答案让我找到解决问题的方法。

我能够用我的DLL导出的相同函数参数成功调用另一个导出函数,并且一个正常工作。这个“注册人”功能比其他导出功能稍长,但由于某些原因不起作用。

1 个答案:

答案 0 :(得分:1)

首先,C ++函数的定义错过extern "C",如果没有指定,由于C ++名称混合,Pinvoke无法找到该函数。

作为C#中的define,指定UnmanagedType.LPTStr,默认情况下,它将是宽字符,但C ++函数RegisterPerson中的参数是char,您应该将其更改为UnmanagedType.LPStr。

更多详情can be found in the MSDN library