记录C# WinForm项目调用Rust生成的dll库

news2024/11/24 8:36:51

一、开发环境

1.RustRover (version:2023.3 EAP)

2.Visual Studio 2019 (version:16.11.30)

3.Windows 10 64位 OS

4.Win+R:控制台程序,cmd.exe

二、使用RustRover编译Rust脚本为dll

1.下载安装Rust,https://www.rust-lang.org/tools/install

2.双击rustup-init.exe直接安装。

3.安装完后,为rust添加x86编译链接器的支持,后续为生成供C# WinForm目标平台为32位的做准备。

按Win+R,输入cmd,回车,输入

rustup target add i686-pc-windows-msvc

如图:

4.安装RustRover,我是用Jetbrains Toolbox安装的,毕竟方便。

5.打开RustRover,创建一个工程,如ForCSharpDll

其中在lib.rs中写上如下代码

#[no_mangle]//表明编译时函数方法名不会被混淆
//extern表示该函数是一个外部函数接口
pub extern fn Hello_Rust(){
    println!("Hello Rust Dll!")
}

#[no_mangle]
pub extern fn Return_Int32() -> i32{
    32767
}

6.在Cargo.toml中写上如下代码

[package]
name = "ForCSharpDll"#包名,即工程的文件夹名
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

[lib]
name = "RustForCSharpDll"#需要生成的dll名称
crate-type = ["cdylib"]#表明是C规范动态库

动态库规范说明:

dylib(动态库),只能被Rust写的程序调用
.so是Linux系统的动态链接库
.dylib是MacOS系统的动态链接库
.dll是Windows系统的动态链接库

cdylib(动态库),可以被其他语言写的程序调用
.so是Linux系统的动态链接库
.dylib是MacOS系统的动态链接库
.dll是Windows系统的动态链接库

7.编译为dll,在RustRover自带的终端里输入:

cargo build --release --target i686-pc-windows-msvc

如图:

如果出现这样的错误,你可能没添加Rust的x86编译链接器的支持,上面的章节一,3.已经说明。

8.找到生成dll的目录

9.把这个dll文件复制到你的WinForm项目的Debug、Release目录下

三、打开你Visual Studio 2019的WinForm项目,输入测试代码

        [DllImport("RustForCSharpDll.dll", EntryPoint = "Hello_Rust", CallingConvention = CallingConvention.Cdecl)]
        public static extern void Hello_Rust();
        [DllImport("RustForCSharpDll.dll", EntryPoint = "Return_Int32", CallingConvention = CallingConvention.Cdecl)]
        public static extern int Return_Int32();

        private void FrmMain_Load(object sender, EventArgs e)
        {
            Hello_Rust();
        }

哦喔Over! o.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1184717.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯第3513题——岛屿个数

解答代码 解题思路全在代码注释中,本题作者使用bfs方式作答 import java.util.*; //1:无需package //2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);//T组数据,遍历T次…

数据库数据恢复——MongoDB数据库报错“错误1067”的数据恢复案例

MongoDB数据库介绍: MongoDB数据库是文档数据存储库,将文档存储在集合之中,不是像MySQL一样的关系型数据库。 MongoDB数据库是开源数据库,同时提供具有附加功能的商业版本。 MongoDB数据库中的数据是以键值对(key-value pairs)的形…

vite + electron引入itk报错

代码 import { readImageArrayBuffer } from itk-wasm console.log(readImageArrayBuffer)通过itk-wasm官网,创建新的项目vitevue(vue2或者vue3),都没问题。加入electeon后包此错。通过排查,意外找到原因,…

短视频电商时代来临,除了抖音,快手,又一个短视频进军电商了!

大家好,我是电商糖果 是一个95后,现居河南郑州。 做电商行业有六年多的时间了,京东,闲鱼,天猫都搞过。 在2020年紧跟当时的电商风口,开始做短视频电商,几个合作人开了一家抖音小店。 因为当…

ElasticSearch的集群、节点、索引、分片和副本

Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档。为了方便大家理解,我们将Elasticsearch里存储文档数据和关系型数据库MySQL存储数据的概念进行一个类比 ES里的Index可以看做一个库,而Types相当于表,Documents则相当…

SpringDataJpa(三)

七、Specifications动态查询 有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA中可以通过JpaSpecificationExecutor接口查询。相比JPQL,其优势是类型安全,更加的面向对象。 import …

霍兰德职业兴趣测试,对职业选择是否有帮助?

人们不喜欢标新立异,喜欢墨守成规,这也是有一定道理的,因为以往的传统更稳妥更可靠。创新是需要承担一定的风险的,求职应聘也是一样,不过虽然时代的发展,招聘方式越来越多的新花样,应聘也变的越…

2023年Q3乳品行业数据分析(乳品市场未来发展趋势)

随着人们生活水平的不断提高以及对健康生活的追求不断增强,牛奶作为优质蛋白和钙的补充品,市场需求逐年增加。 今年Q3,牛奶乳品市场仍呈增长趋势。根据鲸参谋电商数据分析平台的相关数据显示,2023年7月-9月,牛奶乳品市…

【并发编程-2】JUC-1

Lock 互斥锁: 1、锁的可重入性: 当一个线程调用object.lock()获取到锁,进入临界区后,还可以再次调用object.lock()。 通常锁都应该设计为可重入,否则就会发生死锁。 比如synchronized就是可重入,在一个s…

大数据是什么?

1.什么是数据? 数据是什么?什么样的称之为数据呐?我想找个问题提出来,各位小伙伴一定会喷我,脸数据都不知道的还在写什么大数据?但是我们转身再想一想,数据,我们真的了解本质吗&…

5G边缘计算网关的功能及作用

5G边缘计算网关具有多种功能。 首先,它支持智能云端控制,可以通过5G/4G/WIFI等无线网络将采集的数据直接上云,实现异地远程监测控制、预警通知、报告推送和设备连接等工作。 其次,5G边缘计算网关可以采集各种数据,包…

虚拟机ping不通百度,SecureCRTPortable连接不上

虚拟机ping不通百度,SecureCRTPortable连接不上 文章目录 虚拟机ping不通百度,SecureCRTPortable连接不上1、打开虚拟网络编辑器2、更改设置3、NAT设置4、设置网关4、设置网关 cat /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEthernet PROXY_METHO…

Web Worker:JS多线程的伪解药?

前言 在前端开发领域,JavaScript 的单线程限制一直是一个难以忽视的挑战。当谈到解决JavaScript的单线程限制时,HTML5引入的Web Worker被普遍认为是一剂解药💊。同时,业界中大量的文章也是聚焦于讨论web worker的神奇力量。然而&…

Banana Pi BPI-M6开源硬件开发板介绍以及与 Raspberry Pi 5 的比较

Banana Pi BPI-M6 Banana Pi BPI-M6是Banana-Pi组织最新开发的一款类似于Raspberry Pi的单板计算机,具有相同的尺寸格式和相似的功能。 今天我想向您介绍这些功能,并将它们与新的 Raspberry 5 提供的功能进行一些比较。 Raspberry Pi是英国 Raspberry P…

Cesium教程(二十):动态加载图片

1、效果预览 备注: 箭头图片可以去这里下载:箭头下载地址 2、代码编写 创建容器 <div id="cesiumContainer" class="fullSize"

软件版本控制系统VCS工具——cvs vss svn git

版本控制 版本控制系统&#xff08;Version Control System&#xff0c;VCS&#xff09;是用于跟踪和管理源代码和文档的工具。可追踪和管理修改历史&#xff0c;包括修改的内容、时间、作者等信息。有助于团队协作、追踪变更、恢复历史版本等。VCS的主要目的是帮助团队协作开…

竞赛选题 深度学习机器视觉车道线识别与检测 -自动驾驶

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分…

Pytest系列(16)- 分布式测试插件之pytest-xdist的详细使用

前言 平常我们功能测试用例非常多时&#xff0c;比如有1千条用例&#xff0c;假设每个用例执行需要1分钟&#xff0c;如果单个测试人员执行需要1000分钟才能跑完当项目非常紧急时&#xff0c;会需要协调多个测试资源来把任务分成两部分&#xff0c;于是执行时间缩短一半&#…

【gogogo专栏】golang并发编程

golang并发编程 并发编程的工具goroutine介绍协程管理器sync.WaitGroup channel介绍readChannel和writeChannelclose的用法select的用法 通讯示例总结 并发编程的工具 在golang中&#xff0c;并发编程是比较简单的&#xff0c;不像java中那么麻烦&#xff0c;golang天然的支持协…

便携式电能质量分析仪

产品简介 KDZD5000电能质量分析仪是我公司精心研制的现场测试的三相、多功能、智能化、人机操作简洁的综合型测试仪器。具有容易使用&#xff0c;超大液晶彩屏显示&#xff0c;高分辨率&#xff0c;中英文双语操作界面&#xff0c;防振结构外壳等特点。可同时测量4路电流&…