在 C# VB.NET 輸出 Unmanaged DLL

前言

近幾年來 C# 大為流行,不論是桌面應用、網頁、手機 App 都可見其蹤影,其依賴的是強大的 .Net Framework,因此你肯定有經驗,在安裝某個軟體時,會告訴你「需要安裝 .Net Framework XXXX 版」,當然 .Net 框架不只有 C# 使用,可以參考 wiki 上面有列出使用這套框架的語言

我們先來談談什麼是 Managed 的程式碼,根據微軟官方文件說明

Managed 程式碼就是其執行受到執行階段管理的程式碼。

在此情況下,不論實作為何 (Mono、.NET Framework 或 .NET Core),所提到的執行階段都稱為 Common Language Runtime 或 CLR。 CLR 負責將 Managed 程式碼編譯成機器碼,再加以執行。

此外,執行階段提供幾項重要服務,例如自動記憶體管理、安全性界限、型別安全等。

舉個例子來說,你使用 C# 寫的程式碼,編譯完後並不會成為機械碼,也就是不能直接執行,此時是編譯為「通用中間語言(MSIL or CIL)」,當你嘗試執行時,會由 CLR 接管,並且執行 JIT 程序將 IL 碼轉換成機械碼,此時才能真正的執行。但跟 Java 的 Bytecode 有點不同

然而,使用 .Net Framework 開發的 DLL 也因為會需要使用到 .Net Framework,對於一些 Native Code 的語言(如:MFC, Visual C++)並沒辦法直接使用。當你在這些平台開發時,有時會因為其封裝的 API 太少,會想用 C# 來寫一些功能,尤其是 C# 在網路上有很多開源的函式可以使用,這時候將 Managed DLL 轉成 Unmanaged DLL 就有其必要性了。

使用工具

網路上有幾篇教學,教你設定 Visual Studio 使其能夠正常的輸出 Unmanaged DLL,不過不知道是我在這方面比較沒經驗,還是因為版本不同的關係,都沒辦法成功輸出 Unmanaged 版本。

後來發現 GitHub 上有個開源的 .NET DLL 輸出工具「DllExport」,其使用方式非常簡單,官方有附上影片教學

基本上就是將下載下來的DllExport.bat 放到專案目錄,執行後挑選適合你的選項接著按下「Apply」即可,此時會在你的專案中注入一些東西。若你的 Visual Studio 是開著的,會出現提示框問你是否要重新載入,選擇「載入解決方案」即可。

這時候就差不多大功告成了,只需要在你想要輸出的 function 前面將上 [DllExport] 即可。

官方範例如下:

[DllExport]
public static int hello(IntPtr ptr)
{
    return 0;
}

參考資料

  1. 什麼是 Managed 程式碼?
  2. 請問 Managed 型別 及 Unmanaged 資源的定義 ?
  3. Is C# code compiled to native binaries?
  4. Wikipedia - .NET Framework
  5. DLL Export

comments powered by Disqus