C++使用动态链接库将 string 类型参数传给 c#程序调用
使用 char*
类型
在 C++中,使用 char*
类型表示字符串,可以通过以下方式将字符串传递给 C#:
void myFunction(char* str)
{
// do something
}
在 C# 中,您可以通过使用 MarshalAs 属性将字符串转换为 char*
类型来调用 C++ 函数:
[DllImport("myLibrary.dll")]
private static extern void myFunction([MarshalAs(UnmanagedType.LPStr)] string str);
public static void CallMyFunction(string str)
{
myFunction(str);
}
使用 wchar_t*
类型
如果您的字符串包含非 ASCII 字符,建议使用 wchar_t*类型。在 C++中,可以将字符串传递给 C#如下:
void myFunction(wchar_t* str)
{
// do something
}
在 C#中,您可以使用 MarshalAs 属性将字符串转换为 wchar_t*类型,如下所示:
[DllImport("myLibrary.dll", CharSet = CharSet.Unicode)]
private static extern void myFunction([MarshalAs(UnmanagedType.LPWStr)] string str);
public static void CallMyFunction(string str)
{
myFunction(str);
}
在这里,需要指定 CharSet.Unicode 参数,以指示使用 Unicode 编码。
使用 BSTR 类型
另一种方法是使用 Windows API 中的 BSTR 类型。在 C++中,可以将字符串传递给 C#如下
void myFunction(BSTR str)
{
// do something
}
在 C#中,您可以声明 BSTR 类型的参数,并使用 Marshal.StringToBSTR()方法将字符串转换为 BSTR 类型:
[DllImport("myLibrary.dll", CharSet = CharSet.Unicode)]
private static extern void myFunction([MarshalAs(UnmanagedType.BStr)] string str);
public static void CallMyFunction(string str)
{
IntPtr ptr = Marshal.StringToBSTR(str);
myFunction(ptr);
Marshal.FreeBSTR(ptr);
}
在这里,您需要释放分配的内存。