这个问题是另一个的更详细版本
我试图在Rust和C#之间建立一个简单的FFI通信。这个想法是从C#调用Rust函数,反之亦然。这是我的:
public class Program
{
[DllImport("D:\Misc. CSharp\NativeTesting\Rust\target\debug\test.dll")]
public static extern void Test(IntPtr function);
public static void TestFunction()
{
Console.WriteLine("Test!");
}
public delegate void TestDelegate();
public static void Main()
{
Test(Marshal.GetFunctionPointerForDelegate((TestDelegate) TestFunction));
Console.WriteLine("Done");
}
}
这称为Rust程序:
#[no_mangle]
pub extern "C" fn Test(logger: &i8) {
let function = logger.clone() as *const ();
let function: fn() = unsafe { std::mem::transmute(function) };
(function)();
}
这引发以下异常:
Fatal error. System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Repeat 2 times:
--------------------------------
at NativeTesting.Program.Test(IntPtr)
--------------------------------
at NativeTesting.Program.Main()
我查阅了大量其他FFI材料,还没有找到任何好的解决方案(反向p/Invoke、将Rust链接到C#dll或使用CLI(,所以请不要推荐我提到的任何其他工具来做这件事。
正如评论中所指出的,问题在于指针。需要一个*指针,而不是&指针。
新锈蚀代码:
#[no_mangle]
pub extern "C" fn Test(logger: *const i8) {
let function: fn() = unsafe { std::mem::transmute(logger) };
(function)();
}