来自非托管方法的字符串中的 C# 垃圾数据
C# Garbage data in string from unmanaged Method
我有一个非托管方法的包装器:
[DllImport(DLL_LOCATION, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern Boolean voGetFirmwareVersion(StringBuilder s, ref uint d);
工作正常,正在用中文字符填充 StringBuilder。幸运的是,我知道文字应该是什么:
"Camera 0057; FPGA 0009"
我得到的是:
慬慲〠㔰㬷䘠䝐⁁〰グ㤰猀״״诗珊瑚譞珊瑚쬂☐״״造琞\u085cʩ״
我已尝试将 CharSet 更改为我的 DLLImport 标志中的所有组合,并尝试更改返回的字符串编码但无济于事。帮我上网!
编辑:我正在调用的 dll 属于我当前正在编程的设备。所有其他功能都可以使用,但上面提到的功能只会给我汉字。
再次编辑:下面是我用来调用上面方法签名的代码:
private string getFirmware()
{
uint r = 31;
StringBuilder sb = new StringBuilder(31);
bool result = voGetFirmwareVersion(sb, ref r);
if(!result)
{
MessageBox.Show("Error Getting Firmware");
}
return sb.ToString();
}
原来答案是将 CharSet 设置为 None。由于一开始就没有它,它默认为 Unicode。我原以为它会是 none。
我有一个非托管方法的包装器:
[DllImport(DLL_LOCATION, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern Boolean voGetFirmwareVersion(StringBuilder s, ref uint d);
工作正常,正在用中文字符填充 StringBuilder。幸运的是,我知道文字应该是什么:
"Camera 0057; FPGA 0009"
我得到的是:
慬慲〠㔰㬷䘠䝐⁁〰グ㤰猀״״诗珊瑚譞珊瑚쬂☐״״造琞\u085cʩ״
我已尝试将 CharSet 更改为我的 DLLImport 标志中的所有组合,并尝试更改返回的字符串编码但无济于事。帮我上网!
编辑:我正在调用的 dll 属于我当前正在编程的设备。所有其他功能都可以使用,但上面提到的功能只会给我汉字。
再次编辑:下面是我用来调用上面方法签名的代码:
private string getFirmware()
{
uint r = 31;
StringBuilder sb = new StringBuilder(31);
bool result = voGetFirmwareVersion(sb, ref r);
if(!result)
{
MessageBox.Show("Error Getting Firmware");
}
return sb.ToString();
}
原来答案是将 CharSet 设置为 None。由于一开始就没有它,它默认为 Unicode。我原以为它会是 none。