将库嵌入我的应用程序并使其使用该库

时间:2016-01-05 20:32:41

标签: c# mysql embedded-resource

我希望我的可执行文件是我的程序工作所需的唯一东西,但它依赖于库,更具体地说是MySql.Data.dll。如何将此库合并到我的可执行文件中?

我已将DLL拖入项目资源管理器中。此外,我之后选择了它并将其Build Action设置为Embedded Resource

但是,当我在我的应用程序中尝试打开一个新窗口时,我仍然面临一个FileNotFound异常:

未处理的类型' System.IO.FileNotFoundException'发生在PresentationFramework.dll

其他信息:无法加载文件或程序集' MySql.Data,Version = 6.9.8.0,Culture = neutral,PublicKeyToken = c5687fc88969c44d'或其中一个依赖项。系统找不到指定的文件。

编辑:

这与使用WinForms时不同吗?我之前一直在使用WinForms应用程序,其中我使用了ioniczip和一个json库,我将其作为嵌入式资源包含在内。这样我就不需要在应用程序中包含两个DLL文件。

4 个答案:

答案 0 :(得分:2)

请参阅此问题:Merging .net managed dlls

一般来说,您可能需要小心,因为库的条款和条件可能会禁止这样做。

通过设置Build Action,您只在可执行文件中包含DLL内容,但这并不允许.NET使用它。 "嵌入式资源"应该用于包括您的应用程序使用的图像,字体等。

答案 1 :(得分:0)

通常,您需要将所有依赖项复制到PATH环境变量中指定的文件夹,或者将它们放在可执行文件的同一文件夹中。您可能会发现此文章有用Search Path Used by Windows to Locate a DLL

如果您想捆绑dll,可以查看" ILMerge"。

对于像System.IO.FileNotFoundException这样的常见错误'或者' System.IO.BadImageException',您可以尝试使用" Dependency Walker"找出哪些dll缺失。

答案 2 :(得分:0)

您无法使用Embedded Resource分发库。你需要像ILMerge这样的东西。 见http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx

答案 3 :(得分: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);
}

这似乎对我有用。我在一个较旧的项目中找到了它,我需要同样的东西(简直忘了它)