【问题标题】:System.IO.FileNotFoundException occuring in mscorlib.dll?在 mscorlib.dll 中发生 System.IO.FileNotFoundException?
【发布时间】:2016-05-10 15:05:45
【问题描述】:

背景:我正在开发一个非常大的套件,其中包含大约 12 个不同的子应用程序。我的目标是采用这些子应用程序之一并创建自己的可执行文件,并将所有 DLL 嵌入到 EXE 文件中。到目前为止,我已经能够通过以下步骤嵌入大部分 DLL

1) 将 DLL 添加到本地文件夹中的项目中,并将它们设置为“嵌入式资源”。

2) 将这些 DLL 添加到 References 选项卡并将 Copy Local 属性设置为 False

3) 将这些 DLL 添加到 Resources.resx 文件中

我还创建了一个新的 Program.cs 文件并将入口点设置为位于所需子应用程序程序集中的主函数。我的问题是用于运行整个套件的 DLL 文件无法嵌入到子应用程序的 EXE 中,因为我在 mscorlib.dll 中不断收到 System.IO.FileNotFoundException,堆栈框架设置为 System.AppDomain.ExecuteAssembly .但是,我可以完全避免此异常,因为我将“Suite.dll”复制本地属性设置为 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 中?如果需要更多信息,请发表评论,我将编辑问题。谢谢!

【问题讨论】:

    标签: c# .net visual-studio dll


    【解决方案1】:

    将您的 main 函数简化为设置 AssemblyResolve,然后调用另一个类中的另一个函数,该函数执行您现在 main 所做的任何事情。

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

    【讨论】:

    • 你能举个例子吗?我想我明白了你的意思,但我很困惑这将如何工作,因为在异常发生之前从未调用过 Main() 函数(通过在函数开头放置断点来验证)。
    • 你的断点没有验证任何东西。注释掉除了程序集绑定之外的所有内容,它就会神奇地到达。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      与项目引用和 Nuget 包相比,检查您的 App.Config 中是否存在过时或完全错误的条目

      【讨论】:

        猜你喜欢
        • 2021-09-04
        • 1970-01-01
        • 1970-01-01
        • 2018-03-14
        • 2013-10-08
        • 2018-06-28
        • 1970-01-01
        • 1970-01-01
        • 2012-06-22
        相关资源
        最近更新 更多