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;}
 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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM