1. 程式人生 > >C#調用C++導出類的一個實例

C#調用C++導出類的一個實例

新建 分享圖片 img a* mys cte try namespace 失敗

一直認為帶導出類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;}

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

好了,現在開始做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++導出類的一個實例