C#調用C++導出類的一個實例
一直認為帶導出類dll的只有VC自己可以調用,其它編程語言無法調用,今天看到一篇文章才知道自己錯了。
https://blog.csdn.net/huiyouyongdeyu2011/article/details/6547931
一開始“冰yi年華”老哥問我如何調用的時候,我隨口一答:這個比較簡單……
後來他告訴我:你的實例是C#調用C++的導出函數,不是導出類……
我想當然的回答:通俗的說,類不就是多個函數嘛,我馬上寫一個Demo給你……
結果被他言中,我失敗了,找不到這個EntryPoint
後來他告訴我:C++不像C#那樣支持映射,需要另行處理,於是我就開始百度,找了N久才成功,正好貼出來,留來後用。
首先我讓老哥寫了一段C++代碼,如下
#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;}
};
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
好了,現在開始做Demo了:
1、打開VS2008,建一個測試項目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++導出類的實例結束了,整個實例 關鍵是找到對應的每個導出函數。
實例代碼:
點擊下載(119.6 KB)
C#調用C++導出類的一個實例