【问题标题】:When does .net check for assembly dependencies?.net 何时检查程序集依赖项?
【发布时间】:2011-04-12 02:12:46
【问题描述】:

在追求a spearate problem 的过程中,我遇到了一个非常奇特的情况。演示代码是:

public class Global : HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        Log("In Application_Start");
        SomeClass.SomeProp = ConfigurationManager.AppSettings["PropValue"];
    }
    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        Log("In Application_BeginRequest");
        try
        {
            this.Application_Start(null, null);
        }
        catch ( Exception ex )
        {
            Log(ex.ToString());
        }
        Log("At the end of Application_BeginRequest");
    }
}

我在日志中得到的是:

In Application_BeginRequest

Could not load file or assembly 'vjslib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
System.IO.FileNotFoundException
    at MyRootNamespace.Global.Application_Start(Object sender, EventArgs e)
    at MyRootNamespace.Global.Application_BeginRequest(Object sender, EventArgs e) in D:\My Documents\Visual Studio 2008\Projects\SolutionDir\ProjectDir\Global.asax.cs:line 109

At the end of Application_BeginRequest

这对我来说毫无意义。考虑:

  • vjslib 被我的主要项目(程序集)引用,其中包括 Global 类。如果无法解析其依赖关系,为什么还要加载程序集?
  • SomeClass 位于另一个程序集中,该程序集也引用了 vjslibSomeClass 确实使用了 vjslib 并且一些成员确实公开了派生自 vjslib 中的类的类,但这里使用的属性只是一个普通的旧字符串。
  • 为什么堆栈跟踪的第一行没有行号?

是否在每个方法的基础上解决了依赖关系?我以为Microsoft doesn't do such things anymore。这是怎么回事?

【问题讨论】:

    标签: .net assemblies dependencies


    【解决方案1】:

    我相信当 CLR 在 IL 中遇到对某些类型的引用时,它会尝试加载它。它们可能会导致加载程序集。因此,所有依赖程序集不一定会在启动时加载 - 它们会按需加载。

    编辑:在 SO 上查看有关何时加载程序集的这个问题。 “CLR via C#”一书还谈到了在 IL 中遇到 JIT 输入时会加载程序集。

    【讨论】:

    • 这是一种可能性,但请阅读我的最后一个链接(关于“微软不再做这些事情”的链接)。
    • @Vilx,您提供的链接仅涉及 DLL 导入引用的非托管 DLL,而不涉及托管程序集。托管程序集不被导入函数引用,但它们通过元数据(AssemblyRef 条目)被引用。顺便说一句,我已经编辑了我的答案以列出其他几个来源。
    • 我有点认为他们会从过去的错误中吸取教训,即使他们是在另一个部门犯的。那好吧。无论如何,感谢您的链接,这清除了一切!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多