前言:由於項目需要,需制作一個注冊機,將個人PC的MAC值和硬盤序列號與軟件進行綁定,由於筆者的C++不是很好,所以采用C#進行開發。但在采用C#的時候,獲取硬盤的MAC值和序列號的時候又不是很准確,所以這里采用C#調用C++封裝的DLL文件,但是由於工具本身就小,就想將DLL文件直接封裝進EXE執行文件中,於是有了下面的解決方法,該方法筆者已經實現,並投入了使用中。
具體解決方法如下:
1.首先在項目工程中加入一個文件夾,將所需DLL文件加載進來,筆者的項目目錄如下圖。

2.雙擊Properties文件夾下的Resource.resx文件,選擇“添加資源”->“添加現有文件”將FindDisk.dll文件加入項目中,並保存。
3.在程序啟動時候,對system32文件夾下進行判斷,判斷是否存在我們所需的FindDisk.dll文件,如沒有,就從資源文件中讀取出來,並拷貝到system32目錄下(64位操作系統會自動拷貝到C:\Windows\SysWOW64目錄下)。代碼如下:
/// <summary> /// 將dll文件拷貝到系統目錄 /// </summary> private void copyDLL() { string finddiskPath = @"C:\Windows\System32\FindDisk.dll";//設置釋放路徑 string msvcrdllPath = @"C:\Windows\System32\msvcr100d.dll";//設置釋放路徑 //創建dll文件 if (!File.Exists(finddiskPath)) { byte[] finddiskDll = Resources.FindDisk;//獲取嵌入dll文件的字節數組 using (FileStream fs = new FileStream(finddiskPath, FileMode.Create)) { fs.Write(finddiskDll, 0, finddiskDll.Length); } } //創建dll文件 if (!File.Exists(msvcrdllPath)) { byte[] msvcrDll = Resources.msvcr100d; using (FileStream fs = new FileStream(msvcrdllPath, FileMode.Create)) { fs.Write(msvcrDll, 0, msvcrDll.Length); } } }
至此,將DLL文件封裝進exe執行程序中的主要操作完成,具體如何調用,可參看:Java(使用JNA)調用DLL庫與C#調用DLL庫的對比
by Shawn Chen,2017.7.4日,晚。
