从C#ESP值调用C ++ DLL

时间:2012-05-18 17:30:43

标签: c# c++ dll delegates function-pointers

所以我有一个用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);
        }

1 个答案:

答案 0 :(得分:2)

您的呼叫约定不匹配。 C ++函数指针类型使用cdecl。托管代码假定为stdcall。修复如下:

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

或者,您可以将C ++代码中的调用约定更改为stdcall

typedef void (__stdcall *FUNCTION_TYPE)(bool);

但要确保你只做其中一个而不是两个!