背景:我正在开发一个包含大约12个不同子应用程序的超大型套件。我的目标是使用其中一个子应用程序并创建自己的可执行文件,并将所有DLL嵌入到EXE文件中。到目前为止,我已经能够通过以下步骤嵌入大多数DLL
1)将DLL添加到本地文件夹中的项目,并将它们设置为“Embedded Resources”。
2)将这些DLL添加到“引用”选项卡,并将“复制本地”属性设置为“假”
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中?如果需要更多信息,请评论,我将编辑问题。谢谢!
答案 0 :(得分:2)
减少主要功能以设置AssemblyResolve,然后在另一个类中调用另一个函数来执行你现在主要做的事情。
为了使用这个技巧,main和者包含的类都不能引用任何打包的程序集,否则当main被jitted时它们不能被解析。
答案 1 :(得分:1)
我遇到了同样的问题,原因是我从项目文件夹中意外删除了Newtonsoft.Json.dll
。