博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Rust初步(六):在C#中使用Rust组件
阅读量:5269 次
发布时间:2019-06-14

本文共 2225 字,大约阅读时间需要 7 分钟。

文章,我们通过实例比较了一下C#和Rust的性能表现,应该说在Release模式下面,Rust进行计算密集型的运算还是有些比较明显的优势的。那么,我们有没有可能,在C#中做一些快速应用开发,而一些核心的算法用Rust来实现呢?答案是可以的。

 

编写Rust代码

下面这段代码,保存在lib.rs文件中

use std::thread;#[no_mangle]pub extern fn process(){    let handles :Vec<_> =(0..10).map(|_|{        thread::spawn(||{            let mut x= 0;            for _ in (0..5_000_000){                x+=1            }            x        })    }).collect();    for h in handles{        println!("Thread finished with count={}",h.join().map_err(|_| "Could not join a thread!").unwrap());    }    println!("done!");}

 

这段代码的几个关键点在于

1.声明为pub,也就是说要让外部可以访问到

2.声明为extern,意思应该也是说希望外部可以访问

3.添加一个标记 #[no_mangle],这个开关据说是阻止编译器在编译的时候,重命名函数。我也还不是很理解,先照这么做吧

 

其他部分就是标准的Rust代码了

 

生成Rust的动态链接库

默认情况下,Rust编译的库叫做静态链接库,如果我们需要编译动态链接库的话,需要在Cargo.toml文件中定义

然后,运行cargo build -- release命令生成动态链接库(dll)

我们在输出目录中,可以看到一个countlib.dll 的动态链接库文件

 

在C#中使用这个动态链接库

你可以将countlib.dll放在C#编译输出目录的根目录下面

using System;using System.Threading.Tasks;using System.Diagnostics;using System.Threading;using System.Runtime.InteropServices;namespace ConsoleApplication1{    class Program    {                static void Main(string[] args)        {            Stopwatch watch = new Stopwatch();            watch.Start();            //Parallel.For(0, 10, i =>            //{
// var x = 0; // for (int j = 0; j< 5000000; j++) // {
// x += 1; // } // Console.WriteLine("线程:{0} 完成计数",Thread.CurrentThread.ManagedThreadId); //}); watch.Stop(); Console.WriteLine("耗时:{0}秒", watch.Elapsed.TotalSeconds); Console.Read(); } }}
 
在Debug模式下面的耗时为 0.002秒(提升太明显了吧)
 
 
在Release模式下面的耗时为0.002秒(基本上跟Debug模式不相上下,很神奇吗)
 
 
那么,这个性能表现,几乎接近了直接使用Rust的性能,比原先用C#的方式提高了5倍。
 
如此说来,计算密集型(尤其是需要用到多线程,多核)的任务,可以用Rust来编写,然后在C#中调用。
 
 
cargo build默认情况下会根据当前计算机的配置进行编译,例如我是64位的计算机,那么编译出来的dll也是64位的,在C#中用的时候,就需要同样设置为64位,否则就会出现错误
 
 

那么,cargo build是否可以指定对应的平台进行编译呢?可以通过指定 --target参数来实现,可用的值主要有

x86_64-pc-windows-gnu
i686-unknown-linux-gnu
x86_64-unknown-linux-gnu
详细可以参考
我用下面这样用就可以编译一个通用的dll(既能用于32位,也能用于64位——采用WOW模式)
 
 
其实这个编译选项,类似于我们在Visual Studio中使用Any CPU进行编译
 

转载于:https://www.cnblogs.com/chenxizhang/p/4760674.html

你可能感兴趣的文章
51Nod1353 树
查看>>
CF1215E Marbles
查看>>
BZOJ2339 HNOI2011卡农(动态规划+组合数学)
查看>>
octave基本操作
查看>>
axure学习点
查看>>
WPF文本框只允许输入数字[转]
查看>>
dom4j 通用解析器,解析成List<Map<String,Object>>
查看>>
第一个项目--用bootstrap实现美工设计的首页
查看>>
使用XML传递数据
查看>>
TYVJ.1864.[Poetize I]守卫者的挑战(概率DP)
查看>>
0925 韩顺平java视频
查看>>
iOS-程序启动原理和UIApplication
查看>>
SpringMVC入门(二)—— 参数的传递、Controller方法返回值、json数据交互、异常处理、图片上传、拦截器...
查看>>
git的安装
查看>>
mysql 8.0 zip包安装
查看>>
Spring框架系列(三)--Bean的作用域和生命周期
查看>>
springboot + mybatis
查看>>
awk 统计
查看>>
CSS min-height 属性
查看>>
模板设计模式的应用
查看>>