带导出类dll的VC可以调用,其它编程语也可以调用。
实例是C#调用导出类,而不是C++的导出函数。否则,会出现找不到这个EntryPoint的错误。因为你C++不像C#那样支持映射,需要另行处理。
C++ dll代码,如下:
#ifdef TESTDLL_EXPORTS
#define TESTDLL_API __declspec(dllexport)
#else
#define TESTDLL_API __declspec(dllimport)
#endif
// 此类是从 testdll.dll 导出的
class TESTDLL_API Ctestdll {
public:
Ctestdll(void);
// TODO: 在此添加您的方法。
public:
int Add(int a, int b) {return a+b;}
int Sub(int a, int b) {return a-b;}
int Mul(int a, int b) {return a*b;}
};
extern TESTDLL_API int ntestdll;
TESTDLL_API int fntestdll(void);
这里有一个class :Ctestdll,它有三个function:Add、Sub、Mul,通过使用uedit32查看到它对应的三个导出函数分别是
1、?Add@Ctestdll@@QAEHHH@Z
2、?Sub@Ctestdll@@QAEHHH@Z
3、?Mul@Ctestdll@@QAEHHH@Z
调用dll类,现在开始做Demo:
1、打开VS2019,建一个测试项目WindowsFormsApplication2;
2、将C++编译的testdll.dll放入bin/Debug(因为我用的是调试模式);
3、新建一个类库文件,内容如下
using System;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication2
{
class Ctestdll
{
[DllImport("testdll.dll", EntryPoint = "?Add@Ctestdll@@QAEHHH@Z", CharSet = CharSet.Auto)]
private static extern int Add(int a, int b);
public int myAdd(int a, int b)
{
return Add(a, b);
}
[DllImport("testdll.dll", EntryPoint = "?Sub@Ctestdll@@QAEHHH@Z", CharSet = CharSet.Auto)]
private static extern int Sub(int a, int b);
public int mySub(int a, int b)
{
return Sub(a, b);
}
[DllImport("testdll.dll", EntryPoint = "?Mul@Ctestdll@@QAEHHH@Z", CharSet = CharSet.Auto)]
private static extern int Mul(int a, int b);
public int myMul(int a, int b)
{
return Mul(a, b);
}
}
}
4、建一个Form 拖放三个TextBox 和三个Button
5、双击Button,写入如下代码
private void button1_Click(object sender, EventArgs e)
{
Ctestdll test = new Ctestdll();
this.textBox3.Text = test.myAdd(Convert.ToInt32(this.textBox1.Text), Convert.ToInt32(this.textBox2.Text)).ToString();
}
private void button2_Click(object sender, EventArgs e)
{
Ctestdll test = new Ctestdll();
this.textBox3.Text = test.mySub(Convert.ToInt32(this.textBox1.Text), Convert.ToInt32(this.textBox2.Text)).ToString();
}
private void button3_Click(object sender, EventArgs e)
{
Ctestdll test = new Ctestdll();
this.textBox3.Text = test.myMul(Convert.ToInt32(this.textBox1.Text), Convert.ToInt32(this.textBox2.Text)).ToString();
}
6、启动调试(或按F5),尝试三个按钮的功能;
7、调试成功。到此C#调用C++导出类的实例结束了,整个实例 关键是找到对应的每个导出函数。