0

我有一个看起来像这样的 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++ 库被编译为具有多字节编码的多线程 DLL。

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

我能够使用与我的 DLL 导出的函数参数相同的函数参数成功调用另一个导出函数,并且该函数运行良好。这个“注册人”功能比其他导出的功能长一点,但由于某种原因不起作用。

4

1 回答 1

1

首先,C++ 函数的定义漏掉了extern "C",如果没有指定,Pinvoke 会因为 C++ 名称混杂而找不到函数。

正如C#中定义的那样,指定UnmanagedType.LPTStr,默认为宽字符,但C++函数RegisterPerson的参数为char,应改为UnmanagedType.LPStr。

更多详细信息可以在 MSDN 库中找到

于 2012-11-20T06:21:29.577 回答