背景:我正在开发一个包含大约12个不同子应用程序的超大型套件。我的目标是使用其中一个子应用程序并创建自己的可执行文件,并将所有DLL嵌入到EXE文件中。到目前为止,我已经能够通过以下步骤嵌入大多数DLL
1)将DLL添加到本地文件夹中的项目,并将它们设置为“嵌入式资源”。
2)将这些DLL添加到“引用”选项卡,并将“复制本地”属性设置为False
3)将这些DLL添加到Resources.resx文件中
我还创建了一个新的Program.cs文件,并将入口点设置为所需子应用程序集中的main函数。我的问题是用于运行整个套件的DLL文件无法嵌入到子应用程序的EXE中,因为我在mscorlib.dll中不断收到System.IO.FileNotFoundException,堆栈框架设置在System.AppDomain.ExecuteAssembly 。但是,我可以完全避免这种异常,我将“Suite.dll”Copy Local属性设置为true。
这是我的程序集解析器处理程序,但它永远不会被命中,因为在Main函数执行之前,托管代码中发生了异常。
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
string resourceName = new AssemblyName(args.Name).Name+".dll";
string resource = Array.Find(this.GetType().Assembly.GetManifestResourceNames(), element => element.EndsWith(resourceName));
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource))
{
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
}
};
这甚至可以预防吗?如何解决此依赖关系,以便我可以将Suite DLL文件嵌入到我的子应用程序EXE中?如果需要更多信息,请评论,我将编辑问题。谢谢!
减少你的主要功能来设置AssemblyResolve,然后调用另一个类中的另一个函数来执行你现在做的任何事情。
为了使用这个技巧,main和者包含的类都不能引用任何打包的程序集,否则当main被jitted时它们无法解析。
我遇到了同样的问题,原因是我不小心从项目文件夹中删除了Newtonsoft.Json.dll
。