将C#中的string传递给C ++ DLL并返回最简单的例子

我正在尝试使用C#中的C ++ DLL传递string的绝对最简单的例子。

我的C ++看起来像这样:

using std::string; extern "C" { string concat(string a, string b){ return a + b; } } 

像一个头像

 using std::string; extern "C" { // Returns a + b __declspec(dllexport) string concat(string a, string b); } 

我的C#是

 [DllImport("*****.dll", CallingConvention = CallingConvention.Cdecl)] static extern string concat(string a, string b); } 

我打电话给:Console.WriteLine(concat(“a”,“b”));

但是这给了一个System.AccessViolationException。 这看起来似乎是最微不足道的事情,但是我完全停留在这个问题上。 当我试图做一个类似的function“添加”,拿了两个双打,并返回一个双倍我没有任何问题。

你不能通过互操作边界传递一个C ++ std::string 。 你不能在你的C#代码中创build其中的一个。 所以你的代码无法工作。

您需要在互操作性边界上使用互操作性的types。 例如,以空字符结尾的数组。 当你在同一个模块中分配和释放内存时,效果很好。 所以,从C#传递数据到C ++就足够简单了。

C ++

 void foo(const char *str) { // do something with str } 

C#

 [DllImport("...", CallingConvention = CallingConvention.Cdecl) static extern void foo(string str); .... foo("bar"); 

在另一个方向,你通常希望调用者分配被调用者可以写入的缓冲区:

C ++

 void foo(char *str, int len) { // write no more than len characters into str } 

C#

 [DllImport("...", CallingConvention = CallingConvention.Cdecl) static extern void foo(StringBuilder str, int len); .... StringBuilder sb = new StringBuilder(10); foo(sb, sb.Capacity);