首页 > 编程语言 >【Rust编程】.NET9和Rust的互相调用

【Rust编程】.NET9和Rust的互相调用

时间:2024-12-07 20:32:31浏览次数:2  
标签:调用 int 编程 so NET9 dotnet net Rust

以下文章来源于江湖评谈 ,作者江湖评谈

前言

本篇先看下.NET9调用Rust,然后看下Rust调用.NET9。它们相互的一个操作。

.NET9调用Rust

新建一个Rust动态库名为net的项目,进入到项目根目录

# cargo new net --lib
# cd net

Cargo.toml文件添加如下代码:


[lib]
name = "net"             //导出库的名称
crate-type = ["cdylib"]  //c风格的导出函数

src/lib.rs文件修改如下:

#[no_mangle]    //防止Rust编译器改变函数名称
pub extern "C" fn add(a: i32, b: i32) -> i32 {
    a + b
}

生成release的二进制可执行文件

# cargo build --release

linux扩展名为.so,库文件名称是lib+Cargo.toml的lib项指定的名称net。
那么组合起来就是libnet.so,它即是我们需要被.NET调用的库。生成的库的目录如下:

# ls target/release/
build  deps  examples  incremental  libnet.d  libnet.so

新建一个dotnet控制台项目,Program.cs改成如下代码,保存

# dotnet new console -n ABC
# cd ABC
# vim Program.cs
using System;
using System.Runtime.InteropServices;

class Program
{
    // 声明外部函数
    [DllImport("libnet.so", CallingConvention = CallingConvention.Cdecl)]
    public static extern int add(int a, int b);

    static void Main()
    {
        int result = add(2, 3);
        Console.WriteLine($"The result is: {result}");
    }
}

把上面Rust生成的libnet.so复制到dotnet项目的bin/Debug/net9.0目录下面去。此时我们运行dotnet项目,正确的打印出了5。

# dotnet run
The result is: 5

Rust调用.NET

新建一个dotnet类库项目,进入到项目根目录

# dotnet new classlib -n Rust
# cd Rust

csproj文件里面添加PublishAot

<PublishAot>true</PublishAot>

修改Class1.cs文件如下,然后编译下

# vim Class1.cs
using System.Runtime.InteropServices;

internal class Program
{
    [UnmanagedCallersOnly(EntryPoint = "Add")]
    public static int Add(int a, int b)
    {
        return a + b;
    }
}
# dotnet publish -c Release -r linux-x64 --self-contained

生成的结果在bin/Release/net9.0/linux-x64/publish/下Rust.so文件。

我们新建一个rust程序,修改Cargo.toml以及srm/main.rs文件

# cargo new net  //新建rust程序
# cd net
# vim Cargo.toml
[package]
name = "net"
version = "0.1.0"
edition = "2021"

[dependencies]
libloading = "0.7"
libc = "0.2"
# vim src/main.rs
use libc::c_int;
use libloading::{Library, Symbol};

fn main() {
    unsafe {
        let lib = Library::new("Rust.so").expect("加载库失败");
        let func: Symbol<unsafe extern fn(c_int, c_int) -> c_int> = lib.get(b"Add").expect("无法找到函数");
        let result = func(5, 3);
        println!("Result: {}", result);
    }
}

把Rust.so文件复制到Rust项目的根目录下的src文件里面,也即是跟main.rs同目录,最后运行下:

# cp -r bin/Release/net8.0/linux-x64/publish/Rust.so src/
# export LD_LIBRARY_PATH= src/YYY.so  //设置下库目录
# cargo run  //运行结果正确
Result:8

结尾

以上就是Rust和.NET的互相操作,先是.NET调用Rust,再Rust调用.NET。可以看到Rust调用.NET是.NET AOT之后才能够调用的,托管环境下是不行的。

标签:调用,int,编程,so,NET9,dotnet,net,Rust
From: https://www.cnblogs.com/o-O-oO/p/18592631

相关文章

  • PLC编程—数据类型
    CPU型号不同,实际的有效数据类型与文中略有不同(大同小异)数据类型概述基本数据类型(二进制数、整数、浮点数、定时器、DATE、TOD、LTOD、CHAR、WCHAR)复杂数据类型(DT、LDT、DTL、STRING、WSTRING、ARRAY、STRUCT)用户自定义数据类型(PLC数据类型(UDT))指针参数类型系统数据类......
  • 青少年开始学习编程会不会太早?青少年学习编程有哪些好处?通过亲身体验给青少年学习编程
    成长路上不孤单......
  • Rust 从入门到精通:开启高效安全编程之旅
    摘要: 本文全面深入地介绍了Rust编程语言的学习路径,从基础语法起步,逐步深入到内存管理、并发编程、错误处理等核心特性,再到高级主题如宏编程、异步编程以及与其他语言的交互等方面,旨在帮助读者系统地掌握Rust语言,从入门新手成长为精通Rust的开发者,能够运用Rust构建高效......
  • C语言编程实践:自制猜数字小游戏
    一、引言今天分享一个最近编写的猜数字游戏。游戏的要求:1、是电脑自动生成1-100的随机数。2、玩家猜数字,猜数字过程中提示猜大了或者猜小了,提示玩家猜出结果,并限制一定的次数,提高小游戏体验感。二、随机数的生成C语言提供了一个函数叫做rand,这函数是可以生成随机数的,函数......
  • 第二部分:基础知识 5.控制流 --[JavaScript 新手村:开启编程之旅的第一步]
    第二部分:基础知识5.控制流--[JavaScript新手村:开启编程之旅的第一步]JavaScript是一种广泛使用的编程语言,尤其在网页开发中。控制流(ControlFlow)是指程序执行的顺序。通过控制流语句,你可以控制代码按照特定的逻辑顺序执行,而不是从上到下依次执行每一行。1.条件语句:i......
  • 实验5 c语言指针应用编程
    实验任务1task1_1.c1#include<stdio.h>2#defineN534voidinput(intx[],intn);5voidoutput(intx[],intn);6voidfind_min_max(intx[],intn,int*pmin,int*pmax);78intmain(){9inta[N];10intmin,max;1112......
  • 【51编程经验笔记】第五节:蜂鸣器的驱动程序
    第五节:蜂鸣器的驱动程序。开场白:上一节讲了利用累计定时中断次数实现LED灯闪烁,这个例子同时也第一次展示了我最完整的实战程序框架:用switch语句实现状态机,外加定时中断。这个框架看似简单,实际上就是那么简单。我做的所有开发项目都是基于这个简单框架,但是非常好用。上一节只有一个......
  • 【51编程经验笔记】第四节:累计定时中断次数使LED灯闪烁
    第四节:累计定时中断次数使LED灯闪烁。开场白:上一节提到在累计主循环次数来实现计时,随着主函数里任务量的增加,为了保证延时时间的准确性,要不断修正设定上限阀值const_time_level。我们该怎么解决这个问题呢?本节教大家利用累计定时中断次数的方法来解决这个问题。这一节要教会大家......
  • 【51编程经验笔记】第三节:累计主循环次数使LED灯闪烁
    第三节:累计主循环次数使LED灯闪烁。开场白:上一节鸿哥提到delay()延时函数消耗的时间太长了,其它任务根本没有机会执行,我们该怎么改善?本节教大家利用累计主循环次数的方法来解决这个问题。这一节要教会大家两个知识点:第一点:利用累计主循环次数的方法实现时间延时第二点:switch核心语......
  • 【51编程经验笔记】第二节:鸿哥的三区一线理论 & delay()延时实现LED灯的闪烁
    第二节:delay()延时实现LED灯的闪烁。开场白:  上一节鸿哥列出了初学者七大误区,到底什么才是初学者关注的核心?那就是裸机奔跑的程序结构。一个好的程序结构,本身就是一个微型的多任务操作系统。鸿哥教给大家的就是如何编写这个简单的操作系统。在main函数循环中用switch语句实现......