Ну, допустим, такой рабочий пример:
Один проект Server - тип сборки dll для подсистемы Console, native без CLR, платформа x86. Единственный файл main.cpp:
#include <iostream>
using namespace std;
extern "C" __declspec(dllexport) int f(int a, bool (__stdcall *b)(), void *c)
{
cout << "f enter" << endl;
bool r = b();
cout << "f leave" << endl;
return 1;
}
extern "C" __declspec(dllexport) int g(int a, bool (__stdcall *b)(int), void *c)
{
cout << "g enter" << endl;
bool r = b(5);
cout << "g leave" << endl;
return 1;
}
int __stdcall DllMain(void *hinstDLL, unsigned long dwReason, void *lpvReserved)
{
return 1;
}
Второй проект Client - тип сборки exe для подсистемы Console, .NET assembly, платформа x86. Единственный файл Program.cs:
using System;
using System.Runtime.InteropServices;
namespace Client
{
class Program
{
delegate bool B1();
delegate bool B2(int x);
[DllImport("Server.dll")]
static extern int f(int a, B1 b, IntPtr c);
[DllImport("Server.dll")]
static extern int g(int a, B2 b, IntPtr c);
static bool b1()
{
Console.WriteLine("b1 called");
return true;
}
static bool b2(int x)
{
Console.WriteLine("b2 called");
return true;
}
static void Main(string[] args)
{
Console.WriteLine("Main enter");
f(1, new B1(Program.b1), IntPtr.Zero);
g(1, new B2(Program.b2), IntPtr.Zero);
Console.WriteLine("Main leave");
Console.ReadKey();
}
}
}
Результат работы:
Main enter
f enter
b1 called
f leave
g enter
b2 called
g leave
Main leave
Среда Visual Studio 2008, Windows 7.