繁体   English   中英

VB.net dll 在 dll 从 ZD7EFA19FBE7D3972FDZ5ADB30D6 调用时无法正常工作

[英]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]; 

问题的解决方案。

  1. 将项目升级到 .NET 6 ( https://dotnet.microsoft.com/en-us/platform/upgrade-assistant/tutorial/install-upgrade-assistant )
  2. 将 System.Text.Encoding.CodePages NuGet package 添加到解决方案
  3. 在启动时注册编码。
  4. 创建一个全局变量(示例中的编码)并在启动时分配给编码
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)
    Encod = Encoding.GetEncoding(1252)
  1. 修改函数以使用编码。
    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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM