我有一个旧的 C++ DLL 导出函数,带有 ASCII 字符串输出参数。 我设法像这样使用第一个:
[DllImport("MyLibrary.dll")]
private static extern int GetVersion(
[Out, MarshalAs(UnmanagedType.AnsiBStr)]
out string version);
AnsiBStr
类型可以神奇地将 ASCII 转换为 UTF-16(unicode),一切都很好。
我有另一个使用 AnsiBStr 的 SafeArray 的函数。但我不知道如何做同样的伎俩。 我的代码如下,由于缺少 ascii/unicode 转换,结果是一个日语字形数组。
[DllImport("MyLibrary.dll", CharSet = CharSet.Ansi)]
private static extern int GetList(
[Out, MarshalAs(UnmanagedType.SafeArray,
SafeArraySubType = VarEnum.VT_BSTR)]
out string[] result);
不幸的是,没有像VarEnum.VT_ANSI_BSTR
这样的东西......
正确的语法是什么?
最佳答案
您始终可以自己编写编码方法并更改编码。试试这个:
[DllImport("MyLibrary.dll", CharSet = CharSet.Ansi)]
private static extern int GetList(
[Out, MarshalAs(UnmanagedType.SafeArray,
SafeArraySubType = VarEnum.VT_BSTR)]
out string[] result);
private static string[] GetList()
{
string[] arr;
GetList(out arr);
for(int i = 0; i < arr.Length; i++)
{
var bytes = Encoding.Unicode.GetBytes(arr[i]);
arr[i] = Encoding.ASCII.GetString(bytes);
}
return arr;
}
如果您使用大量类似的方法,您还可以创建自定义编码器。
关于c# - AnsiBStr SafeArray 上的 PInvoke,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28971104/