2016-01-05 31 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。

相关问题