2010-09-14 99 views
4

在追求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。這裏發生了什麼?

回答

3

我相信,當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

相關問題