我希望我的可执行文件是我的程序工作所需的唯一东西,但它依赖于库,更具体地说是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文件。
答案 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);
}
这似乎对我有用。我在一个较旧的项目中找到了它,我需要同样的东西(简直忘了它)