使用 DllImport 从 C# 调用时出现 std::wstring 问题

Issue with std::wstring when calling from c# with DllImport

我打算从 c# 调用 c++ 库中的非托管函数,但它崩溃了。在进行故障排除时,我将范围缩小到 std::wstring。一个最小的例子如下所示:

C++

#include <iostream>

extern "C" __declspec(dllexport) int __cdecl Start()
{
    std::wstring test = std::wstring(L"Hello World");

    return 2;
}

C#

using System.Runtime.InteropServices;

internal class Program
{
    [DllImport("test.exe", CallingConvention=CallingConvention.Cdecl)]
    public static extern int  Start();

    static void Main(string[] args)
    {
        var result = Start();

        Console.WriteLine($"Result: {result}");
    }
}

这让我出现堆栈溢出。如果我删除带有 std::wstring 的行或将其更改为 std::string,则没有问题,我会返回 2.

谁能给我解释一下这是怎么回事?

这是我注意到的:

[DllImport("test.exe", CallingConvention=CallingConvention.Cdecl)]

从 EXE 而不是 DLL 导出函数不是标准的。 (我觉得可以,但是不推荐。)

将您的 C++ 代码构建为 DLL 而不是 EXE。 Statically link 带有 C++ 运行时库的 DLL,以避免因加载程序搜索路径中没有正确的 DLL 而导致的缺失依赖性问题。