2011年7月4日 星期一

將非 COM 元件的外部 DLL ,包入 .NET 開發的執行檔中 (PART 1)

最近開發程式時發現一個問題,
就是要整合第三方程式時,希望把第三方軟體包進去自己的程式中,
用意是不想要讓 User 直接取用第三方軟體。

問題是第三方軟體不是用 .NET 開發,
而且也不是一般的 COM 元件,
所以無法用一般方法包進去程式中。

我試了幾個方式都不行
  1. 註冊成 GAC (失敗)
  2. 註冊 DLL (失敗)
  3. 使用 ILMerge (失敗)
  4. 在程式中引用 (失敗)
  5. 以專案方式打包 (失敗)
  6. 使用 Load Assembly (失敗)
  7. 放入資源檔再解出 (可以,需搭配 API)
  8. 使用 API 載入 (可以)
會失敗的原因我猜想是因為非 COM 元件所致,
只是沒試過很不干心,不過試了之後就死心了。

其實載入 DLL 的方法有很多種,
Declare Function就是其中一個可以載入非 COM 元件的方法,
不過這個方式沒法達到我想要包進程式中的目的。

解法就是使用資源檔包入 DLL,然後在程式執行時將 DLL 解出來放到某個地方,
再以 API 去動態載入 DLL。

會使用到的 API 有以下三個
    Declare Function LoadLibrary Lib "kernel32" (ByVal LibFilePath As String) As Integer
    Declare Function GetProcAddress Lib "kernel32" (ByVal ModuleHandle As Integer, ByVal ProcName As String) As Integer
    Declare Function FreeLibrary Lib "kernel32" (ByVal ModuleHandle As Integer) As Integer

使用方式請參考
將非 COM 元件的外部 DLL ,包入 .NET 開發的執行檔中 (PART 2)

沒有留言:

張貼留言