.net何时检查程序集依赖性?

时间:2010-09-14 10:01:05

标签: .net assemblies dependencies

在追求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位于另一个引用vjslib的程序集中。 SomeClass确实使用vjslib,并且某些成员确实公开了从vjslib中的类派生的类,但此处使用的属性只是一个普通的旧字符串。
  • 为什么堆栈跟踪的第一行没有行号?

依赖性是否按每个方法解决?我以为Microsoft doesn't do such things anymore。这是怎么回事?

1 个答案:

答案 0 :(得分:4)

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

编辑:在SO上查看有关何时加载程序集的问题。书“CLR via C#”也讨论了在IL中遇到JIT遇到的类型时加载程序集。