如何从Rust调用C#/.NET?求可用示例代码
问题描述
我是Rust及跨语言互操作(interop/FFI)新手,找到两篇相关文章但难以理解原理,ChatGPT帮助有限。现寻求可用示例代码,希望不使用YubiKey专属Rust crate,通过调用官方C# SDK实现枚举YubiKey设备等操作。以下是我尝试的代码:
尝试的C#代码
using System; namespace MyMathLibrary { public class MathFunctions { public static int Addition(int x, int y) { return x + y; } } }
尝试的Rust代码
use std::path::PathBuf; use std::env; use winapi::um::libloaderapi::{LoadLibraryA, GetProcAddress, FreeLibrary, HMODULE, FARPROC}; use std::ffi::CString; type AdditionFn = extern "C" fn(i32, i32) -> i32; fn main() { unsafe { let exe_path = env::current_exe().expect("path to file couldn't be found"); let dll_path = exe_path.with_file_name("MathLibrary.dll"); let dll_name = CString::new(dll_path.to_str().expect("invalid file path")).expect("CString creation failed"); let dll_handle: HMODULE = LoadLibraryA(dll_name.as_ptr()); if dll_handle.is_null() { panic!("DLL konnte nicht geladen werden"); } let addieren_fn_name = CString::new("Addition").expect("CString creation failed"); let addition_fn_ptr: FARPROC = GetProcAddress(dll_handle, addieren_fn_name.as_ptr()); if addition_fn_ptr.is_null() { panic!("function not found"); } // 注:此处存在笔误,AdditionnFn 应为 AdditionFn let addition_fn: AdditionnFn = std::mem::transmute(addition_fn_ptr); let result = addition_fn(10, 20); println!("result: {}", result); FreeLibrary(dll_handle); } }
内容的提问来源于stack exchange,提问作者markus-gruppe-e
相关产品推荐
相关产品推荐

