下面的例子说明了我想要做什么。 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) })
}
https://stackoverflow.com/questions/70077273/