在mscorlib.dll中发生System.IO.FileNotFoundException?

时间:2016-05-10 15:05:46

标签: c# .net visual-studio dll

背景:我正在开发一个包含大约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中?如果需要更多信息,请评论,我将编辑问题。谢谢!

2 个答案:

答案 0 :(得分:2)

减少主要功能以设置AssemblyResolve,然后在另一个类中调用另一个函数来执行你现在主要做的事情。

为了使用这个技巧,main和者包含的类都不能引用任何打包的程序集,否则当main被jitted时它们不能被解析。

答案 1 :(得分:1)

我遇到了同样的问题,原因是我从项目文件夹中意外删除了Newtonsoft.Json.dll