gpt4 book ai didi

c# - 如何从 C# 中使用具有另一个函数作为参数的 Rust 函数?

转载 作者:行者123 更新时间:2023-12-05 09:30:00 25 4
gpt4 key购买 nike

下面的例子说明了我想要做什么。 operation 函数接收一个值和一个函数作为参数,然后返回函数的执行。到目前为止一切都很完美。现在我想在库中使用该函数 operation 以在 C# 中使用。

fn operation(number: i32, f: &dyn Fn(i32) -> i32) -> i32 {
f(number)
}
fn square(number: i32) -> i32 {
number * number
}
fn cube(number: i32) -> i32 {
number * number * number
}

fn test() {// passing a function as parameter, OK :)
println!("{}", operation(5, &square));
println!("{}", operation(7, &square));
println!("{}", operation(3, &cube));
}

// Tried without success :_(
/*
#[no_mangle]
pub extern "C" c_operation(number: i32, f: &dyn Fn(i32) -> i32) -> *mut i32 {
unsafe {
&mut f(number)
}
}
*/

c_operation函数的正确签名应该是什么?

我认为当签名在库中定义良好时,以下 C# 代码应该可以工作。

const string RSTLIB = "../../PathOfDLL";

public delegate int Fn(int number);

[DllImport(RSTLIB)] static extern int c_operation(int x, Fn fn);

int Square(int number) => number * number;
int Cube(int number) => number * number * number;

void Test()
{
Console.WriteLine("{0}", c_operation(5, Square));
Console.WriteLine("{0}", c_operation(7, Square));
Console.WriteLine("{0}", c_operation(3, Cube));
}

感谢您的关注

最佳答案

为了在 C 中使用,声明 c_operation 并根据 operation 定义它的一种方法如下:

#[no_mangle]
pub extern "C" fn c_operation(
number: i32,
f: unsafe extern "C" fn(i32) -> i32
) -> i32 {
operation(number, &|n| unsafe { f(n) })
}

关于c# - 如何从 C# 中使用具有另一个函数作为参数的 Rust 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70077273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com