我有一个旧的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
没有...
什么是正确的语法?
答案 0 :(得分:2)
您可以随时自行编写编组方法并更改编码。试试这个:
[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;
}
如果您使用许多类似的方法,也可以创建自定义编组器。