我正在使用C DLL,在使用P / Invoke编组字符串时遇到麻烦。
DLL具有如下结构:
typedef struct
{
char sAddress[256];
BYTE byUseRtsp;
WORD wPort;
}INFO,*LPINFO;
我的C#结构看起来像这样:
[StructLayout(LayoutKind.Sequential)]
public struct INFO
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string sAddress;
public byte byUseRtsp;
public short wPort;
}
sAddress
的字符串编组处理ASCII文本,但是DLL始终使用UTF-8编码。因此,一旦使用了多字节字符,编组就会使文本乱码。使用CharSet.Unicode
在这里不起作用,因为这会告诉编组在Windows上将字符串编码/解码为UTF-16。我需要一个CharSet.Utf8
,很不幸,它不存在。
I do有一种解决方法,但是它很丑,如果可能的话,请避免使用。解决方法是替换:
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string sAddress;
with:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public byte[] sAddress;
然后重新编写代码,以使用Encoding.UTF8.GetBytes/String()
方法获取字符串值。我还需要使用此方法自己处理空终止符。
是否有更好的方法?
是否有更好的方法?
使用内置选项将您所做的工作编组起来可能和它一样好。您可能想编写一些辅助方法来为您管理此操作,但是我敢肯定您对此还活着。
除此之外,您还可以使用自定义封送处理程序。我不知道在此主题上有大量工作要做。一个更完整的碰巧是我的这个问题:How do I write a custom marshaler which allows data to flow from native to managed?