c# - AnsiBStr SafeArray 上的 PInvoke

标签 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这样的东西...... 正确的语法是什么?

最佳答案

您始终可以自己编写编码方法并更改编码。试试这个:

[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/

相关文章:

unicode - 什么是unicode变体选择器

.net - Microsoft安全通报(2269637)对.NET编码的影响

c# - PInvoke lmdif1 签名

C# P/调用 : native output parameter value won't reach managed code

c# - 为什么运行时窗口更大?

c# - 将图像转换为字节流

python - UnicodeEncodeError : 'ascii' codec can't encode character [. ..]

mysql - 替换 utf8mb4_unicode_ci 上的特定字符 MySQL 搜索

c# - 查找嵌套和排序

c# - IIS 池回收、池重启、应用程序重启、web.config 更新 - 全局 asax