ghe*_*het 6 .net c# c++ windows pinvoke
我想制作一个可以在C#项目中使用的本机C++.
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 []?
我可能会使用 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[]找到你需要的东西。