![](/img/trans.png)
[英]What encoding does Mono use when marshalling strings in P/Invoke?
[英]How can I override default encoding when marshalling strings?
我有一個 Delphi 2007 DLL 這個出口:
function TestSignString(s, Sign: PChar): LongBool; stdcall;
我使用此導入在 .NET Core v7 C# 中調用它:
[DllImport(@"LibraryName.dll")]
[return:MarshalAs(UnmanagedType.Bool)]
internal static extern bool TestSignString(string s, string sign);
我正在傳遞s
和sign
參數,當運行時系統具有默認編碼(預期)WIN1250 時一切正常).
所以我的問題是,在 C# 中封送字符串時如何覆蓋默認編碼? 我的意思是兩種方式 - 作為輸入參數和 output 也請。
我嘗試將導入更改為:
[DllImport(@"LockBoxLibrary.dll", CharSet = CharSet.Ansi)]
但運氣不好,我缺少代碼頁 (1250) 規范。
我有一個“臟”解決方案,因為它可能正在泄漏 memory。 如果您知道更好的方法,請告訴我。 我有兩種將字符串轉換為 nint 的擴展方法,反之亦然。
private static string FromAnsiPtrToUtf8Str(this nint n)
{
var length = 0;
while (Marshal.ReadByte(n + length) != 0)
{
length++;
}
var strbuf = new byte[length];
Marshal.Copy(n, strbuf, 0, length);
return Encoding.GetEncoding(1250).GetString(strbuf);
}
private static nint FromUtf8StrToAnsiPtr(this string s) => GCHandle.Alloc(Encoding.GetEncoding(1250).GetBytes(s), GCHandleType.Pinned).AddrOfPinnedObject();
導入更改為: private static extern bool TestSignString(nint s, nint sign);
方法調用: TestSignString(s.FromUtf8StrToAnsiPtr(), sign.FromUtf8StrToAnsiPtr());
嘗試將TestSignString
更改為 UTF-16 字符串,或引入寬字符串 (W) 版本,它是 2023:-)
function TestSignStringW(s, Sign: PWideChar): LongBool; stdcall;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.