2016-01-05 33 views
1

我希望我的可執行文件成爲我的程序工作所需的唯一東西,但它依賴於庫,更具體地說是MySql.Data.dll。我怎樣才能將這個庫合併到我的可執行文件中?將庫嵌入到我的應用程序中並使其使用該庫

我已經將DLL拖入我的項目瀏覽器。此外,我已經事後選擇了它,並設置其Build ActionEmbedded Resource

但是我仍然面臨着FileNotFound異常,當我在我的應用程序試圖打開一個新窗口:

型System.IO的」未處理的異常。在PresentationFramework.dll中發生了FileNotFoundException'

其他信息:無法加載文件或程序集'MySql.Data,Version = 6.9.8.0,Culture = neutral,PublicKeyToken = c5687fc88969c44d'或其某個依賴項。該系統找不到指定的文件。

編輯:

這與使用WinForms有何不同?我之前一直在做這個,用一個WinForms應用程序,我使用ioniczip和一個json庫,我將它作爲嵌入式資源包含在內。這樣我就不需要在應用程序中包含這兩個DLL文件。

回答

0

我找到了另一種解決方案。 DLL文件添加爲一個的ressource的項目,然後我將它添加到App.xaml.cs

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

System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    string dllName = args.Name.Contains(',') ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll", ""); 
    dllName = dllName.Replace(".", "_"); 
    if (dllName.EndsWith("_resources")) 
     return null; 
    System.Resources.ResourceManager rm = new System.Resources.ResourceManager(GetType().Namespace + ".Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly()); 
    byte[] bytes = (byte[])rm.GetObject(dllName); 
    return System.Reflection.Assembly.Load(bytes); 
} 

這爲我做的伎倆似乎。我發現它在一個較舊的項目中,我曾經在那裏需要相同的東西(簡單地忘了它)

2

看到這個問題:Merging .net managed dlls

一般來說,你可能要小心,因爲庫的條款和條件也禁止這樣做。

通過設置構建操作,您只在可執行文件中包含DLL內容,但不允許.NET使用它。 「Embedded Resource」應該用於包含應用程序使用的圖像,字體等。

0

通常您需要將所有依賴項複製到PATH環境變量中指定的文件夾,或將它們放在可執行文件的同一文件夾中。您可能會發現這篇文章有幫助Search Path Used by Windows to Locate a DLL

如果你想捆綁dll,你可以看看「ILMerge」。

對於像'System.IO.FileNotFoundException'或'System.IO.BadImageException'這樣的常見錯誤,您可以嘗試使用「Dependency Walker」來確定缺少哪些dll。

相關問題