C# 调用 Rust 编写的 dll 之二:输入输出简单数值

C# 调用 Rust 编写的 dll 之二:输入输出简单数值

文中所有的程序运行环境为:windows 10 64bit,Net 5.0,Rust 1.51;乌龙哈里 2021-05-05

接上文《C# 调用 Rust 编写的 dll 之一:创建 dll》

一、输入输出 int

1、输入 int:

rust lib.rs 中写入

#[no_mangle]//不写这个会把函数名编译成其他乱七八糟的
pub extern fn input_int(n:i32){
    println!("rust dll get i32: {}",n);
}

c# 调用

        [DllImport("D:\LabRust\Learn\ln_dll\target\release\rustdll.dll",
        EntryPoint = "input_int",
        CallingConvention = CallingConvention.Cdecl)]
        public static extern void InputInt(int n);
        static void TestInputInt(int n)
        {
            InputInt(n);
        }

在 main() 中修改:

        static void Main(string[] args)
        {
            //TestHelloRust();
            TestInputInt(100);

            Console.WriteLine("Hello C# !");
            Console.Read();
        }

结果:

/*
rust dll get i32: 100
Hello C# !
*/

2、输出 int

rust 写入函数:

#[no_mangle]//不写这个会把函数名编译成其他乱七八糟的
pub extern fn output_int(n:i32)->i32{
    println!("Rust Dll get i32: {}",n);
    n+100
}

c# 调用:

        [DllImport("D:\LabRust\Learn\ln_dll\target\release\rustdll.dll",
        EntryPoint = "output_int",
        CallingConvention = CallingConvention.Cdecl)]
        public static extern int OutputInt(int n);
        static int TestOutputInt(int n)
        {
            return OutputInt(n);
        }
        static void Main(string[] args)
        {
            //TestHelloRust();
            //TestInputInt(100);
            Console.WriteLine($"output:{TestOutputInt(100)}");

            Console.WriteLine("Hello C# !");
            Console.Read();
        }

结果:

/*
Rust Dll get i32: 100
output:200
Hello C# !
*/

3、修改 int

能不能把输入值直接修改呢?直接上代码看看。 rust lib.rs:

#[no_mangle]//不写这个会把函数名编译成其他乱七八糟的
pub extern fn modify_int(n:&mut i32){
    println!("Rust Dll get i32: {}",n);
    *n+=100;
}

c# 调用并运行:

        [DllImport("D:\LabRust\Learn\ln_dll\target\release\rustdll.dll",
        EntryPoint = "modify_int",
        CallingConvention = CallingConvention.Cdecl)]
        public static extern void ModifyInt(ref int n);
        static void TestModifyInt(ref int n)
        {
            ModifyInt(ref n);
        }
        static void Main(string[] args)
        {
            int n = 100;
            TestModifyInt(ref n);
            Console.WriteLine($"modify:{n}");

            Console.WriteLine("Hello C# !");
            Console.Read();
        }

结果为:

/*
Rust Dll get i32: 100
modify:200
Hello C# !
*/

大功告成,能修改!

试了一下 tuple 元组,编译时说不是 FFI safe,就不弄了。

原文地址:https://www.cnblogs.com/leemano/p/14732540.html