您不需要使用Marshal.GetFunctionPointerForDelegate(),P /
Invoke编组器会自动执行此操作。您需要在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();}以及用于创建非托管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");}这足以让您开始使用它。一百万个细节可能使您陷入困境,您一定会遇到其中一些。使这种代码运行的更有效的方法是用C /
CLI语言编写包装器。这也使您可以包装C 类,而P /
Invoke无法做到这一点。此处提供了不错的教程。



