c# - 从 C# 中的 Rust DLL 获取 UTF-8 编码的字符串

标签 c# string dll utf-8 rust

我找到了很多关于 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/

相关文章:

c# - 奇怪的对象空引用异常

c# - 为什么默认情况下只有文字字符串保存在实习生池中?

c++ - 无法从不区分大小写的字符串中提取 double ?

c++ - 调用dll方法时如何解决访问冲突写入位置

c++ - 如何阻止函数在 MS VS C++ 中导出?

c++ - 调用DLL函数问题

c# - 从 .Net Framework 客户端调用 gRPC 服务器时出现异常

c# - LINQ - 选择前 10% 的元素

c# - 关于计算随机颜色

c - 修复段错误