从 C# ESP 值调用C++ DLL

Calling C++ DLLs from C# ESP value

本文关键字:C++ DLL 值调用 ESP      更新时间:2023-10-16

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

您的调用约定不匹配。C++函数指针类型使用 cdecl 。托管代码假定 stdcall .像这样修复它:

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

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

typedef void (__stdcall *FUNCTION_TYPE)(bool);

但请确保您只执行其中之一,而不是同时执行两项!