使用 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 而导致的缺失依赖性问题。
我打算从 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 而导致的缺失依赖性问题。