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

下面的例子说明了我想要做什么。 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/

相关文章:

c++ - `shared_ptr::use_count() == 0` 和 `shared_ptr

ios - 如何获取 UTType 图像、音频和视频的所有扩展

ruby-on-rails - 如何一次为 Ruby 中的对象分配多个属性

c++ - 从字节初始化一个由 trivially_copyable 但不是 default_con

function - 关于在函数和宏定义中使用结构文字

javascript - 显示: inline is used时隐藏元素符号

javascript - 左关联二叉树折叠

r - 在 dplyr 中跨列过滤

apache-kafka - 如何触发Kafka再平衡?

java - 在java中对字符串进行排序时如何忽略空格?