Ну, допустим, такой рабочий пример:
Один проект 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.