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