簡體   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