c# - 从 C# ESP 值调用 C++ DLL

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

所以我有一个用 C++ 制作的 DLL,并且在 C# 中使用它。问题是我在C++中使用函数指针,所以我做了一个委托(delegate)。漏洞程序可以工作,但完成后我收到一个消息框,指出 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);

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

关于c# - 从 C# ESP 值调用 C++ DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10657162/

相关文章:

c++ - 为有条件编译的产品实现工厂模式

windows - 在没有 CGo 的情况下从 Go 调用 COM 对象方法

python - 将 C 结构传递给 C DLL 中的函数

c# - HttpClient 发布到 ApacheServer (Debian)

c# - DDD聚合根

c++ - 如何使用 C++ 检查窗口句柄是否在 Win32 中以管理模式运行?

c# - 从内存中加载库/模块

C# NewtonSoft Single Object 或 Array JsonConverter 不工作,没有错误

c# - ASP.net 缓存 ASHX 文件服务器端

c++ - 使用 Cppcheck 检查非标准文件扩展名