什么时候.NET会检查程序集依赖关系?

问题描述:

在追求a spearate problem时我遇到了一个非常奇怪的情况。一个演示代码如下:什么时候.NET会检查程序集依赖关系?

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。这里发生了什么?

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

编辑:看到这个问题在SO关于何时装配被加载。本书“通过C#CLR”还谈到在IL中遇到由JIT遇到的程序集加载时的问题。

+0

这是一种可能性,但后来读了我的最后一个链接(关于“微软不再做这样的事情了”)。 – 2010-09-14 10:39:40

+1

@Vilx,你提供的链接只涉及DLL导入引用的非托管DLL,而不是托管程序集。托管程序集不被导入函数引用,但它们通过元数据(AssemblyRef条目)进行引用。顺便说一句,我编辑了我的答案列出其他来源的几个。 – VinayC 2010-09-14 10:50:10

+0

我有点以为他们会从他们过去的错误中学习,即使他们是在另一个部门制造的。好吧。无论如何,感谢您的链接,清除了一切! – 2010-09-14 10:58:03