我正在尝试创建一个简单的MFC DLL,导出其功能并在C#.net项目中使用 在下面的代码中我在DLL中有两个方法,我已经把海报的建议带到了原始问题。我正在重新发布当前代码,我收到了错误
{“无法在DLL中找到名为'_Worker_Create @ 0'的入口点'C:\ Users \ mspath \ Documents \ MDS_SIMCA \ DevSIMCA_Dll \ TestDLL \ Debug \ MFClib.dll'。”:“”}
我使用了dumpbin.exe来获取正确的错位名称。
#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;
}
班级工人 { 上市: 工人(无效); 〜员(无效);
static int GetInteger ();
static int DoMath (int iOne, int iTwo);
};
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);
}
}
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);
}
}
答案 0 :(得分:1)
您必须在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 ++生锈了所以我可能会略微关闭语法和/或适当的内存管理。
答案 1 :(得分:1)
您的通话惯例是错误的。 __declspec(dllexport)仅使函数导出,它不会使其具有标准调用约定。我会将__stdcall或WINAPI添加到您的函数签名中,以便它们使用标准调用。你的一个函数是有效的,因为它没有参数传递或弹出堆栈。