无法获取要在.net中运行的MFC dll函数

本文关键字:运行 MFC dll 函数 net 获取 | 更新日期: 2023-09-27 18:19:51

我正在尝试创建一个简单的MFC DLL,导出它的函数并在C#.net项目中使用在下面的代码中,我在DLL中有两个方法,我已经采取了海报对原始问题的建议。我正在转发当前代码,我得到错误

{"找不到名为"的入口点_Worker_Create@0'in DLL'C:''Users''mspath''Documents''MDS_SIMCA''DevSIMCA_DLL''TestDLL''Debug''MFClib.DLL'。":"}

我使用了dumpbin.exe来获得正确的损坏名称。

MFC DLL.cpp

   #include "stdafx.h"
    #include "Worker.h"
    Worker::Worker(void)
    {
    }
    Worker::~Worker(void)
    {
    }
    int Worker::GetInteger()
    {
        return 44;
    }
    int Worker::DoMath(int iOne, int iTwo)
    {
        return iOne * iTwo;
    }

MFC DLL.h

阶级工人{公共:工人(无效);~工人(无效);

static int GetInteger ();
static int DoMath (int iOne, int iTwo);

};

MFCLib.cpp

extern "C"
{
    __declspec(dllexport) void * __stdcall Worker_Create()
    {
        return new Worker();
    }
    __declspec(dllexport) void  * __stdcall Worker_Destroy(Worker * instance)
    {
        delete instance;
        instance = 0;
        return instance;
    }
    __declspec(dllexport) int __stdcall Worker_DoMath(Worker * instance, int i, int j)
    {
        return instance->DoMath(i, j);
    }
}

C#.net

   public partial class MainWindow : Window
    {
/*
 *          from dumbin.exe /exports:
 *          
          1    0 00011519 _Worker_Create@0 = @ILT+1300(_Worker_Create@0)
          2    1 00011230 _Worker_Destroy@4 = @ILT+555(_Worker_Destroy@4)
          3    2 000110D2 _Worker_DoMath@12 = @ILT+205(_Worker_DoMath@12)
*/
        [DllImport("C:''Users''mspath''Documents''MDS_SIMCA''DevSIMCA_Dll''TestDLL''Debug''MFClib.dll",
                EntryPoint = "_Worker_Create@0",
                ExactSpelling = false,
                CallingConvention = CallingConvention.StdCall)]
        public extern static IntPtr Worker_Create();
        [DllImport("C:''Users''mspath''Documents''MDS_SIMCA''DevSIMCA_Dll''TestDLL''Debug''MFClib.dll",
                EntryPoint = "_Worker_Destroy@4",
                CallingConvention = CallingConvention.StdCall)]
        public extern static IntPtr Worker_Destroy(IntPtr iptr);
        [DllImport("C:''Users''mspath''Documents''MDS_SIMCA''DevSIMCA_Dll''TestDLL''Debug''MFClib.dll",
                EntryPoint = "_Worker_DoMath@12",
                CallingConvention = CallingConvention.StdCall)]
        public extern static int Worker_DoMath(IntPtr instance, int i, int j);
        public MainWindow()
        {
            InitializeComponent();
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            IntPtr instance = Worker_Create();
            int i = Worker_DoMath(instance, 4, 2);
            Worker_Destroy(instance);
        }
    }

无法获取要在.net中运行的MFC dll函数

您必须在C++类的外部声明外部"C样式"函数。一种方法是通过管道将调用发送到类:

__declspec(dllexport) int DoMath (int iOne, int iTwo)
{
    Worker* worker = new Worker();
    int i = worker-> DoMath(iOne, iTwo);
    delete worker;
    return i;
}

或者将C++类转换为C++/CLI类,并将库导入为托管库,而不是非托管

免责声明:我的C++太生疏了,所以我可能对语法和/或正确的内存管理有点偏离。

您的调用约定是错误的__declspec(dllexport)只导出函数,并没有使其具有标准的调用约定。我会将__stdcall或WINAPI添加到您的函数签名中,以便它们使用标准调用。您的一个函数之所以有效,是因为它没有要传递或从堆栈中弹出的参数。