C# C++编写的DLL中函数回调
时间: 2023-08-10 19:31:09 浏览: 123
在 C# 中调用 C++ 编写的 DLL 中的函数,并在其中注册回调函数,需要使用 `System.Runtime.InteropServices` 命名空间中的 `DllImport` 和 `UnmanagedFunctionPointer` 特性。
首先,在 C# 中声明与 C++ 中相同的回调函数类型,并使用 `UnmanagedFunctionPointer` 特性指定函数的调用约定和参数传递方式(默认为 `Cdecl` 和 `ByValTStr`)。例如,如果 C++ 中定义了如下回调函数类型:
```cpp
typedef void (*Callback)(int result);
```
则在 C# 中需要这样声明:
```csharp
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void CallbackDelegate(int result);
```
然后,在 C# 中声明与 C++ 中相同的函数,并使用 `DllImport` 特性指定 DLL 的路径和函数名。对于回调函数参数,在 C# 中需要使用 `CallbackDelegate` 类型进行声明。
例如,如果 C++ 中定义了如下函数:
```cpp
void DoSomething(Callback callback);
```
则在 C# 中需要这样声明:
```csharp
[DllImport("MyDll.dll")]
public static extern void DoSomething(CallbackDelegate callback);
```
在调用该函数时,需要先将回调函数转换为 `CallbackDelegate` 类型,并使用 `GCHandle.Alloc` 方法将回调函数保持在内存中,以免被垃圾回收器回收。调用完毕后,还需要使用 `GCHandle.Free` 方法释放回调函数占用的内存空间。
例如,可以这样调用该函数:
```csharp
void MyCallback(int result)
{
Console.WriteLine($"Result: {result}");
}
CallbackDelegate callback = new CallbackDelegate(MyCallback);
GCHandle handle = GCHandle.Alloc(callback);
DoSomething(callback);
handle.Free();
```
阅读全文