You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:52:36