关于AnsiBStr的SafeArray的PInvoke

时间:2015-03-10 18:13:35

标签: c# unicode pinvoke dllimport ansi

我有一个旧的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没有... 什么是正确的语法?

1 个答案:

答案 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;
}

如果您使用许多类似的方法,也可以创建自定义编组器。