首页 > 编程语言 >[记]Rust使用winrt库调用第三方C# DLL库的方法?

[记]Rust使用winrt库调用第三方C# DLL库的方法?

时间:2023-05-08 11:14:48浏览次数:30  
标签:use 调用 C# DLL winrt Rust

Rust 是一门系统编程语言,它的运行时比较"轻量级",因此难以跨平台地直接调用 Windows Runtime (WinRT) 组件。不过我们可以通过 Rust 库 winrt 来操作 WinRT 组件,同时也可以通过 Rust 的 FFI( Foreign Function Interface ) 功能来调用第三方 C# DLL 库。

以下是调用第三方 C# DLL 库的步骤:

  1. 在 Rust 项目中添加 winrt 依赖库的引用:
[dependencies]
winrt = "0.8.1"
  1. 使用 winrt::import 宏导入 WinRT 组件和所需的类型:
#[macro_use] extern crate winrt;

use winrt::Interface;
use winrt::RuntimeName;
use winrt::windows::foundation::{IStringable, PropertyValue};
use winrt::windows::storage::streams::{Buffer, DataReader, InMemoryRandomAccessStream};
  1. 在 Rust 代码中使用 extern 关键字导入 C# DLL 库中的函数:
#[link(name="MyCSharpDll", kind="dylib")]
extern "C" {
fn MyFunction(arg1: u32, arg2: *const u16) -> u32;
}

其中 link 属性中 name 参数对应的是 DLL 库文件名,kind 参数表示库类型,dylib 表示动态链接库。

  1. 在 Rust 代码中调用导入的函数:
let arg1: u32 = 12345;
let arg2: Vec<u16> = vec![0x0068, 0x0065, 0x006C, 0x006C, 0x006F, 0x002C, 0x0020, 0x0052, 0x0075, 0x0073, 0x0074, 0x0021, 0x0000];
let result = unsafe { MyFunction(arg1, arg2.as_ptr()) };

这里的 arg1arg2 分别是传递给 C# DLL 库函数的参数。unsafe 关键字用于表示该代码块包含不安全的操作,因为 Rust 无法保证被调用的 C# DLL 函数不会造成内存安全问题。

需要注意的是,使用 FFI 调用 C# DLL 库时需要注意数据类型的对齐方式,确保 Rust 代码和 C# DLL 库中的数据类型定义一致,否则可能会导致内存访问越界或解析错误的结果。

以上就是在 Rust 中使用 winrt 库和 FFI 功能调用第三方 C# DLL 库的步骤。

标签:use,调用,C#,DLL,winrt,Rust
From: https://www.cnblogs.com/hardfood/p/17381083.html

相关文章

  • 文件系统 fdatasync fsync sync 详解
    一、Buffer和Cache简介 数据写入内存空间,这段空间就是缓冲区buffer,写入缓冲区把数据从内存空间读出,这段空间就是缓存器cache,读取缓存区  1、cacheCache:缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器。 Cache并不是缓存文件的,而是缓存块的(块......
  • WPF注入service,将service作为viewModel参数时,无法进入Model的问题。
    WPF注入service,将service作为viewModel参数时,无法进入Model的问题。一开始以为是注入失败,或者注入的service不对。经过排查,发现是viewModel中的参数service,不是当前包的service,是api通用包中的。....更改之后就可以进入Model了。......
  • 2023 xjtupc 西交校赛
    A签到,\(O(1)\)。C++Code#include"bits/stdc++.h"usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intn;cin>>n;cout<<(n<=6?"water"......
  • Oracle 报错:ORA-01438: 值大于为此列指定的允许精度
    今天在插入oracle数据库时,提示“ORA-01438:值大于为此列允许的精度“错误,经网上查找资料后解决了此错误错误说明ORA-01438,发生此错误的原因在于我们插入的数据长度超过了字段指定的字段长度,比如插入的数据为102329204123.33829492,小数点前长度为12,小数点后长度为8,若字段字符类型......
  • 双有源全桥变换器(DAB)电流前馈控制模型,采用C代码实现控制过程,可极大提高变换器动态响
    双有源全桥变换器(DAB)电流前馈控制模型,采用C代码实现控制过程,可极大提高变换器动态响应性能。模型里也包含传统电压环控制,可用于对比。~ID:94180679900002231......
  • elSelect点击空白处无法收起下拉框(失去焦点并隐藏)
    学习记录,为了以后有同样的问题,省得再百度了,方便自己也方便你们element中多选的select有个问题,就是点击空白或者关闭弹窗,下拉还会一直展示出来百度了好一会,觉得下面两位大佬说的最合理,然后就搬运了下由于我这边业务很简单,然后就不想全局折腾参考大佬链接地址https://www.jb51.cc/......
  • Python 和 JavaScript 的区别是什么?
    Python和JavaScript是两门非常流行的编程语言,它们各自有着独特的特点和应用场景。Python和JavaScript是两种不同的编程语言,它们的设计目标和应用场景有所不同。Python是一种多用途、高级、解释型的编程语言,可用于开发各种应用程序,包括Web开发、数据分析、人工智能、科学计算......
  • Pycharm中的黄色、绿色、红色波浪线
    黄色波浪线是提醒用户代码不规范,不影响程序运行。Ctrl+Alt+L快捷键组合消除黄色波浪线。或者使用Code菜单下的ReformatCode功能 原来空格和空行的使用都是有讲究的:函数定义的前面和后面都要有两个空行=、+、*、/等运算符两边都要有一个空格,#用作注释时,后面要留出一个空格,如果......
  • JavaScript原生兼容大全-持续更新
    JavaScript兼容-持续更新1.css非行内样式操作//currentStyle用于IE低版本getComputed用于主流浏览器//element目标元素attribute目标属性functiongetStyle(element,attribute){returnelement.currentStyle?element.currentStyle(attribute):getComputed(el......
  • docker 打包 springboot 项目快速入门
    docker打包springboot项目快速入门文末源码@[toc]1.构建Sringboot工程新建项目创建接口packagecom.wangshiyu.javapub.demo.springbootdocker.controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.......