C#调用本机C++所有函数:要使用哪些类型?

ghe*_*het 6 .net c# c++ windows pinvoke

我想制作一个可以在C#项目中使用的本机C++.

  • 如果我想将C#中的字符串传递给C++中的函数,我应该使用什么参数?
  • 我知道C#字符串使用Unicode,所以我尝试了wchar_t*用于该函数,但它不起作用; 我尝试捕获从被调用函数引发的任何异常,但没有抛出任何异常.
  • 我还想返回一个字符串,以便我可以测试它.

C++函数如下:

DECLDIR wchar_t * setText(wchar_t * allText) {
  return allText;
}
Run Code Online (Sandbox Code Playgroud)

C#代码如下:

[DllImport("firstDLL.Dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]     
public static extern string setText(string allText);

var allText= new string('c',4);
try {
  var str1 = setText(allText);
}
catch (Exception ex) {
  var str2 = ex.Message;
}
Run Code Online (Sandbox Code Playgroud)

我应该使用什么类型的C++函数的返回类型,以便我可以从C#调用它,返回类型为string[]?相同的Q但是函数的参数是C#中的string []?

Dav*_*nan 3

我可能会使用 COM BSTR 来完成此操作,并避免混乱缓冲区分配。像这样的东西:

C++

#include <comutil.h>
DECLDIR BSTR * setText(wchar_t * allText)
{
    return ::SysAllocString(allText);
}
Run Code Online (Sandbox Code Playgroud)

C#

[DllImport(@"firstDLL.dll", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.BStr)]
private static extern string setText(string allText);
Run Code Online (Sandbox Code Playgroud)

BSTR 是本机 COM 字符串类型。此处使用它的优点是可以使用 COM 分配器在接口的本机端(在 C++ 中)分配内存,然后使用相同的分配器在接口的托管端销毁内存。P/Invoke 编组器了解有关 BSTR 的所有内容并为您处理一切。

虽然您可以通过传递缓冲区长度来解决这个问题,但它会导致相当混乱的代码,这就是我更喜欢 BSTR 的原因。


对于你的第二个问题,关于 P/Invoking ,我想你会从Chris Taylor对 Stack Overflow 上另一个问题的回答中string[]找到你需要的东西。