我找到了很多关于 C# 中 Rust DLL 实现的 US-ANSI 字符串的信息,但这并没有解决 UTF-8 编码字符串的任何问题。
例如,"Brötchen"
在 C# 中调用后,结果为 "Brötchen"
。
使用rust
use std::os::raw::c_char;
use std::ffi::CString;
#[no_mangle]
pub extern fn string_test() -> *mut c_char {
let c_to_print = CString::new("Brötchen")
.expect("CString::new failed!");
let r = c_to_print;
r.into_raw()
}
C#
[DllImport(@"C:\Users\User\source\repos\testlib\target\debug\testlib.dll")]
private static extern IntPtr string_test();
public static void run()
{
var s = string_test();
var res = Marshal.PtrToStringAnsi(s);
// var res = Marshal.PtrToStringUni(s);
// var res = Marshal.PtrToStringAuto(s);
// Are resulting in: ????n
Console.WriteLine(res); // prints "Brötchen", expected "Brötchen"
}
如何获得想要的结果?
我认为这不是 How can I transform string to UTF-8 in C#? 的副本因为它的答案产生的方式与 Marshal.PtrToStringAuto(s)
和 Marshal.PtrToStringUni(s)
相同。
最佳答案
答案在于使用 Marshal.PtrToStringUTF8,简化,
use std::ffi::CString;
#[no_mangle]
pub extern "C" fn string_test() -> *mut c_char {
let s = CString::new("Brötchen").expect("CString::new failed!");
s.into_raw()
}
然后是 C#
[DllImport(RUSTLIB)] static extern IntPtr string_test();
//...
var encodeText = string_test();
var text = Marshal.PtrToStringUTF8(encodeText);
Console.WriteLine("Decode String : {0}", text);
关于c# - 从 C# 中的 Rust DLL 获取 UTF-8 编码的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54707579/