DLL関数の呼び出し

C++関数を呼び出す方法

class Program
{
    // Win32 MessageBox関数の宣言
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);

    static void Main(string[] args)
    {
        MessageBox(new IntPtr(0), "text", "caption", 0);
    }
}
使用例 - DllImportAttribute クラス (System.Runtime.InteropServices) | MSDN

C#から呼び出せるC++の関数の作成と、それを呼び出す方法

C++側

関数名で呼び出せるようにextern "C"を、外部から参照できるように__declspec(dllexport)を指定します。またC#側の呼び出し規約と一致するように__stdcallも指定します。

extern "C" __declspec(dllexport) int __stdcall Add(int a, int b);

ソースでは__stdcalだけ指定します。

int __stdcall Add(int a, int b)
{
    return a + b;
}

C#側

DllImport属性を使用して宣言します。

class Program
{
    [DllImport("test.dll")]
    public static extern int Add(int a, int b);

    static void Main(string[] args)
    {
        int result = Add(2, 3);
    }
}

C++の関数呼び出し時にMDAPInvokeStackImbalanceが検出されるときには、呼び出し規約が一致するようにC++の関数に__stdcallを指定するか、DllImportの引数でCallingConvention.Cdeclを指定します。.net - Why do I get "PInvokeStackImbalance was detected" for this simple example? - Stack Overflow

C#から利用できるC++のDLLを作成する方法 | Windows Mobile アプリケーション開発

MSDN (Microsoft Developer Network) から検索