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。這裏發生了什麼?
這是一種可能性,但後來讀了我的最後一個鏈接(關於「微軟不再做這樣的事情了」)。 – 2010-09-14 10:39:40
@Vilx,你提供的鏈接只涉及DLL導入引用的非託管DLL,而不是託管程序集。託管程序集不被導入函數引用,但它們通過元數據(AssemblyRef條目)進行引用。順便說一句,我編輯了我的答案列出其他來源的幾個。 – VinayC 2010-09-14 10:50:10
我有點以爲他們會從他們過去的錯誤中學習,即使他們是在另一個部門製造的。好吧。無論如何,感謝您的鏈接,清除了一切! – 2010-09-14 10:58:03