【发布时间】:2022-01-01 17:35:00
【问题描述】:
以下示例说明了我想要做什么。 操作函数接收一个值和一个函数作为参数,然后返回函数的执行。到目前为止,一切都很完美。现在我想在库中使用该函数 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));
}
感谢您的关注
【问题讨论】:
-
你有一个涉及 Rust 和 C# 的问题,但是 C 和 C++ 是如何出现的呢?请不要发送不相关的标签。
-
感谢您的评论。添加这些标签是因为与来自 Rust、C 或 C++ 库的 C# 的互操作性在 C# 代码中没有太大区别。
标签: c# rust language-interoperability