在VS2015中先創建C#項目,然後再創建要編寫的動態庫DLL項目,這樣做的好處是整個解決方案的編程環境是C#模式,這樣就可以有很多智能的提示或快捷的編程方式在整個解決方案中都可以使用。
一:創建C#控制台應用程序:用於調用C++編寫的DLL
(1)啟動VS2015》文件》新建》項目,在彈出的新建項目對話框中按下圖進行選擇填寫,先填寫項目的名稱,再修改解決方案的名稱。
(2)項目創建後,整體效果如下圖:
二:用C++創建DLL
下面僅僅創建了DLL,具體創建DLL的講解請參考【在VS2015中用C++編寫可被其它語言調用的動態庫DLL】
(1)在解決方案上右擊選擇【添加】>【新建項目】
(2)在添加新項目對話框中,按下圖進行選擇填寫
(3)在下圖的創建向導對話框中進行如下選擇
(4)在下圖的創建向導對話框中進行如下選擇
(5)項目創建後,整體效果如下圖:
(6)在【頭文件】上右擊進行如下選擇
(7)在添加新項對話框中進行如下選擇填寫
(8)在CreateDLL.cpp文件中添加對CreateDLL.h的引用並且添加下圖所示測試代碼
(9)在CreateDLL.h文件中添加下圖所示測試代碼
(10)在【源文件】上右擊進行如下選擇
(11)在添加新項對話框中進行如下選擇填寫
(12)在CreateDLL.def文件中添加下圖所示測試代碼
(13)先將解決方案切換到Release模式,再在CreateDLL項目名稱上右擊選擇【生成】或【重新生成】
注:Release模式下生成的DLL才是最終的,Debug模式下生成的DLL有時會出問題
(14)在解決方案所在的目錄中打開Release文件夾即可看到生成的DLL
(15)用Dependency Walker查看導出函數名是否正確,直接將CreateDLL.dll拖到Dependency Walker軟件界面即可,如下圖
(16)使用DLL函數查看器(3.5)查看導出函數名和參數數量是否正確,直接將CreateDLL.dll拖到DLL函數查看器(3.5)軟件界面即可,如下圖
三:用C#項目調用C++創建DLL
(1)將C#項目設置為啟動項目,並且將解決方案設置為Debug模式
(2)在C#項目的program.cs文件中編寫如下代碼,代碼中DLL的路徑中的斜槓,測試發現左斜、右斜都可以,代碼中的相對路徑指的是:編譯後的exe程序相對於DLL的路徑
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace CSharpCallDLL { class Program { [DllImport(@"../../../Debug/CreateDLL.dll", EntryPoint = "test01", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] extern static int test01(int a, int b, int c); [DllImport(@"../../../Debug/CreateDLL.dll", EntryPoint = "test02", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] extern static int test02(int a, int b); static void Main(string[] args) { int r1 = test01(1, 2, 3); int r2 = test02(5, 2); Console.WriteLine("test01結果:" + r1.ToString()); Console.WriteLine("test02結果:" + r2.ToString()); Console.ReadKey(); } } }(3)運行C#項目輸出結果如下
(4)若想實現C#調用DLL時自動進入到C++項目設置的斷點,需在C#工程右鍵【屬性】->【調試】->【啟動調試器】中選中【啟動本機代碼調試】
(5)在C++項目的源碼中設置斷點,在Debug模式下運行C#程序會自動跳到斷點處,如下圖,從中可以看到C#項目中的值已經傳到C++項目中了
(6)源碼下載地址:在VS2015中用C++創建DLL並用C#調用且同時實現對DLL的調試源碼
(7)Dependency Walker軟件下載地址:Dependency Walker動態庫導出函數查看器
(8)DLL函數查看器(3.5)軟件下載地址:DLL函數查看器(3.5)