2

したがって、C ++で作成したDLLがあり、C#で使用しています。問題は、C ++で関数ポインターを使用しているため、デリゲートを作成したことです。ホールプログラムは機能しますが、終了後、ESPの値が関数に保存されなかったことを示すメッセージボックスが表示されます。

私のコード:C ++ DLL

typedef void (*FUNCTION_TYPE)(bool);
extern "C"
{
    DLL void prim(int a, FUNCTION_TYPE myF)
    {
        if(a < 2)
        {
            myF(false);
            return;
        }

        for (int i = 2; i < a; i++)
        {
            if (a % i == 0)
            {
                myF(false);
                return;
            }
        }

        myF(true);
    }
};

私のC#コード(dllを呼び出す):

delegate void SOME_FUNCTION(bool isFine);

        [DllImport("DLLs")]
        private static extern void prim(int n, SOME_FUNCTION afisare);

        static void afisare(bool isFine)
        {
            if (isFine == true)
                Console.WriteLine("Da, e prim");
            else
                Console.WriteLine("Nu, nu e prim");
        }

        static void Main(string[] args)
        {
            SOME_FUNCTION myAfis = afisare;
            prim(17, myAfis);
        }
4

1 に答える 1

2

呼び出し規約が一致していません。C++関数ポインタ型はを使用しcdeclます。マネージコードはを想定していstdcallます。次のように修正します。

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void SOME_FUNCTION(bool isFine);

または、C++コードの呼び出し規約を次のように変更することもできますstdcall

typedef void (__stdcall *FUNCTION_TYPE)(bool);

ただし、両方ではなく、これらの1つだけを実行するようにしてください。

于 2012-05-18T17:34:26.890 に答える