[英]Encoding in VB.net dll doesn't work properly when the dll is called from C#
我在 VB.Net DLL 中有以下两个函数。 它们模拟旧 BASIC 的 CVL$ 和 MKL$ 功能。
function CVL 采用 4 字节字符串并将其转换为 Int32 Integer。 MKL function 则相反。
这些函数在 DLL 内部使用。 当从 VB.NET 项目调用 DLL 时,一切正常。 当从 C# 调用 DLL 时,值完全不正确。 显然问题出在编码上,但我已经尝试了所有可用的选项(ASCII、UTF7、UTF8),但都没有。 有任何想法吗?
Function CVL(ByVal Value As String) As Integer
Dim Encoding As System.Text.Encoding = System.Text.Encoding.Default
Dim Bytes() As Byte = Encoding.GetBytes(Value)
Return BitConverter.ToInt32(Bytes, 0)
End Function
Function MKL(ByVal Value As Integer) As String
Dim Encoding As System.Text.Encoding = System.Text.Encoding.Default
Dim Bytes() As Byte = BitConverter.GetBytes(Value)
Return Encoding.GetString(Bytes)
End Function
string
不是字节缓冲区,它有非常严格的编码规则。 我可以很容易地看到正常的编码规则将如何延长或缩短您用来转换为 integer 的结果字节。 事实上,即使一切正常,您的字符串的字节数也是生成的 integer 的两倍。 您是否考虑过您默默丢弃的其他 4 个字节会发生什么?
要么做正确的事并使用字节缓冲区(甚至更好的跨度),要么自己手动解码从字符串到整数,反之亦然。 写一些同样破碎但至少定义明确的东西是非常微不足道的:
static int CVL(string s) =>
s[3] << 24 | s[2] << 16 | s[1] << 8 | s[0];
问题的解决方案。
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)
Encod = Encoding.GetEncoding(1252)
Function CVL(ByVal Value As String) As Integer
Dim Encoding As System.Text.Encoding = Encod
Dim Bytes() As Byte = Encoding.GetBytes(Value)
Return BitConverter.ToInt32(Bytes, 0)
End Function
Function MKL(ByVal Value As Integer) As String
Dim Encoding As System.Text.Encoding = Encod
Dim Bytes() As Byte = BitConverter.GetBytes(Value)
Return Encoding.GetString(Bytes)
End Function
我仍然不明白为什么 C# 程序会在内部影响 VB.Net 程序,但这段代码解决了这个问题。
感谢那些给我一些好主意的人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.