Han*_*ant 50
你不需要使用Marshal.GetFunctionPointerForDelegate(),P/Invoke marshaller会自动执行它.您需要在C#端声明一个委托,其签名与C++端的函数指针声明兼容.例如:
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
class UnManagedInterop {
private delegate int Callback(string text);
private Callback mInstance; // Ensure it doesn't get garbage collected
public UnManagedInterop() {
mInstance = new Callback(Handler);
SetCallback(mInstance);
}
public void Test() {
TestCallback();
}
private int Handler(string text) {
// Do something...
Console.WriteLine(text);
return 42;
}
[DllImport("cpptemp1.dll")]
private static extern void SetCallback(Callback fn);
[DllImport("cpptemp1.dll")]
private static extern void TestCallback();
}
Run Code Online (Sandbox Code Playgroud)
以及用于创建非托管DLL的相应C++代码:
#include "stdafx.h"
typedef int (__stdcall * Callback)(const char* text);
Callback Handler = 0;
extern "C" __declspec(dllexport)
void __stdcall SetCallback(Callback handler) {
Handler = handler;
}
extern "C" __declspec(dllexport)
void __stdcall TestCallback() {
int retval = Handler("hello world");
}
Run Code Online (Sandbox Code Playgroud)
这足以让你开始使用它.有一百万个细节可以让你遇到麻烦,你一定会碰到其中一些.获得此类代码的更有效方法是使用C++/CLI语言编写包装器.这也允许你包装一个C++类,这是P/Invoke无法做到的.这里有一个体面的教程.
归档时间: |
|
查看次数: |
36001 次 |
最近记录: |