2012-02-10 79 views
9

我有一個DLL >>System.Data.SQLite.dll如何使用嵌入資源中的DLL加載?

以正常的方式使用它>只需添加它作爲參考,並

using System.Data.SQLite; 

然後,我可以使用所有的功能在這個DLL裏面。

,我要合併我APP.EXE這個DLL到一個單一的文件。 我嘗試過使用ILmerge,但失敗。據我所知,ILmerge不能合併非管理DLL。

所以,我嘗試另一種方法>使DLL作爲embbed資源。 我能夠將它與下面的代碼加載作爲一個組件:

Stream stm = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyApp.System.Data.SQLite.dll"); 
byte[] ba = null; 
byte[] buffer = new byte[16 * 1024]; 
using (MemoryStream ms = new MemoryStream()) 
{ 
    int read; 
    while ((read = stm.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     ms.Write(buffer, 0, read); 
    } 
    ba = ms.ToArray(); 
} 
Assembly sSQLiteDLL = Assembly.Load(ba); 

但是,我應該如何去使用功能SQLiteDLL?

我也嘗試添加DLL作爲資源屬性和加載它是這樣的:

public Form1() 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
    InitializeComponent(); 
} 

System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    AppDomain domain = (AppDomain)sender; 
    if (args.Name.Contains("System_Data_SQLite")) 
    { 
     return domain.Load(MyApp.Properties.Resources.System_Data_SQLite); 
    } 
    return null; 
} 

以上解釋的是什麼,我這麼遠,我不知道接下來用什麼做DLL?我仍然無法使用DLL中的函數。

例如,當我鍵入:

SQLiteCommand cmd = new SQLiteCommand(); 

在Visual Studio說:

錯誤21類型或命名空間名稱 'SQLiteCommand' 找不到(是否缺少using指令集引用?)

你能分享您的見解?謝謝。

+2

您應該能夠結合上述方法來實現此目的。它確實需要將SQLite程序集作爲參考添加,否則VS不知道如何處理它。我不知道這是如何解決您的本機DLL問題。運行時您仍然需要它作爲物理文件。 – 2012-02-10 13:35:43

+0

你問了一個非常類似的問題,並得到了很多答案,包括一些鏈接等 - 你檢查這些答案/鏈接? – Yahia 2012-02-13 12:14:46

+0

@Yahia:學習......需要一些時間。我試過SmartAssembly,並且是成功的。無法使用** ILmerge **。也許錯過了一些參數。對於** ILmerge **,我使用的參數是:'ilmerge /out:MyApp2.exe MyApp.exe System.Data.SQLite.dll'發生錯誤,它表示組件** System.Data.SQLite.dll **未被標記爲僅包含託管代碼。現在我將嘗試在代碼中手動合併DLL。如果成功,我會讓你知道。嘿,謝謝你的幫助。真心讚賞。 – alont 2012-02-14 02:01:41

回答

4

您可以嵌入彙編,並在同一時間基準它(在VS)......你想使用它,你需要引用的方式!任何你不參考大會的理由?

從嵌入式組件(管理),而不引用它是有點困難使用A型,但使用反射等可能 - 看到這些鏈接(它們包括參考材料和一些示例代碼等):

在嵌入受管DLL的過程中,您有幾個選擇:

OR

  • 使用一些工具,如SmartAssembly(商業)
    它可以嵌入和除其他外合併(無需更改源代碼)

OR

  • code that yourself in less than 10 lines(免費的,但極少改變源代碼)
    標記所有需要的依賴關係爲「嵌入的資源」 - 這種方式,他們都包含在EXE文件......你需要設置一個AssemblyResolve處理器它在運行時讀取參考資料並將所需的DLL返回到.NET運行時...
+1

嗨,Yahia,在一些項目中取得了一些成功。我決定爲此寫一篇教程。閱讀更多:[鏈接](http://www.codeproject.com/Articles/528178/Load-DLL-From-Embedded-Resource) – alont 2013-01-16 15:26:38

+0

@alont非常好:-) – Yahia 2013-01-16 15:30:30

+0

非常感謝你。 {握手} :) – alont 2013-01-16 16:07:25