zoukankan      html  css  js  c++  java
  • 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,就不弄了。

  • 相关阅读:
    如何将jar包加入到Maven本地仓库
    dubbo 常见错误
    关于spring”通配符的匹配很全面, 但无法找到元素 'context:component-scan' 的声明“的错误
    Maven类包冲突终极三大解决技巧 mvn dependency:tree
    springMVC传对象参数
    scp 对拷文件夹 和 文件夹下的所有文件 对拷文件并重命名
    CATALINA_BASE与CATALINA_HOME的区别
    有return的情况下try catch finally的执行顺序(最有说服力的总结)
    Slf4j MDC 使用和 基于 Logback 的实现分析
    Docker 系列01: Centos7.3 上安装docker
  • 原文地址:https://www.cnblogs.com/leemano/p/14732540.html
Copyright © 2011-2022 走看看