2010-11-09 40 views
1

我正在使用的網站使用第三方程序集,讓我們假設A.dll。該組件A也爲一些操作加載另一個組件B.我的網站使用A完全不需要B,而我沒有B.dll。從.NET 3.5到4.0:Web應用程序崩潰,因爲未使用的程序集未找到

這是從來沒有問題,當我的目標是.NET 3.5,但現在我試圖移動到.NET 4,我得到一個錯誤。當我在瀏覽器中查看我的網站時,我得到:「無法加載文件或程序集」B.dll「[...]」。如果我把B.dll放在bin目錄中,它可以正常工作。

但是,我不想部署B.dll,我不知道是什麼讓.NET 4嘗試加載該程序集,而網站並未使用需要它的任何A功能。我很困惑,因爲相同的代碼在.NET 3.5上工作正常。我猜測它會嘗試加載所有程序集,即使它不會被使用。我正在尋找一些防止這種行爲的配置或編譯器標誌。任何指針?

我試圖通過省略細節和原因來簡化我的問題,爲什麼我不希望B部署等。請讓我知道,如果我提供的信息沒有給出明確的問題。謝謝!

編輯:

堆棧跟蹤

[FileNotFoundException異常:未能加載文件或程序集B,版本= 15.4.0.0,文化=中性公鑰= 1a5b964d6f0fbeab'或它的一個依賴。系統不能找到指定的文件]

_Default.Page_Load(對象發件人,EventArgs e)如C:\ Users \用戶鮑勃\桌面\的WebSite1 \ Default.aspx.cs:15

的System.Web。 Util.CalliHelper.EventArgFunctionCaller(IntPtr fp,Object o,Object t,EventArgs e)+14 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender,EventArgs e)+35 System.Web.UI.Control.OnLoad( EventArgs的)91 System.Web.UI.Control.LoadRecursive()74 System.Web.UI.Page.ProcessRequestMain(布爾includeStagesBeforeAsyncPoint,布爾includeStagesAfterAsyncPoint)2207

大會負載跟蹤

===預綁定狀態信息=== LOG:用戶=鮑勃 LOG:DisplayName的= B,版本= 15.4.0.0,文化=中性公鑰= 1a5b964d6f0fbeab (完全指定) LOG:Appbase = file:/// C:/ Users/bob/Desktop/WebSite1/ LOG:初始PrivatePath = C:\ Users \ bob \ Desktop \ WebSite1 \ bin 調用程序集:A,版本= 16.0.0.0,Culture = neutral,PublicKeyToken = null。

=== LOG:此綁定在默認加載上下文中啓動。 LOG:使用應用程序配置文件:C:\ Users \ bob \ Desktop \ WebSite1 \ web.config LOG:使用主機配置文件: LOG:使用C:\ Windows \ Microsoft.NET \ Framework \ v4中的計算機配置文件.0.30319 \ CONFIG \ machine.config中。 日誌:後策略參考:B,版本= 15.4.0.0,文化=中立,PublicKeyToken = 1a5b963c6f0fbeab 日誌:嘗試下載新的URL文件:/// C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/website1/efdbfea0/f60231a3/B.DLL。 日誌:嘗試下載新的URL文件:/// C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP。NET Files/website1/efdbfea0/f60231a3/B/B.DLL。 日誌:試圖下載新的URL文件:/// C:/Users/bob/Desktop/WebSite1/bin/B.DLL。 日誌:試圖下載新的URL文件:/// C:/Users/bob/Desktop/WebSite1/bin/B/B.DLL。 日誌:試圖下載新的URL文件:/// C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/website1/efdbfea0/f60231a3/B.EXE。 日誌:試圖下載新的URL文件:/// C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/website1/efdbfea0/f60231a3/B/B.EXE。 日誌:試圖下載新的URL文件:/// C:/Users/bob/Desktop/WebSite1/bin/B.EXE。 日誌:試圖下載新的URL文件:/// C:/Users/bob/Desktop/WebSite1/bin/B/B.EXE。

+0

什麼是堆棧跟蹤? – SLaks 2010-11-09 01:19:37

回答

1

發現問題;我們調用的程序集中的一個方法在方法簽名中有一個來自B.dll的值類型。在.NET 4.0中,即使永遠不會調用該方法,也會加載B.dll。

解決方法是修改方法簽名以刪除對B值類型的所有引用。

1

第15行的Default.aspx.cs調用的函數使用B.dll。

+0

我會調查更多,因爲實際上第15行只依賴於A,它依次從C繼承,而D不需要B爲我在第15行要求加載的內容加載。此外,此問題不會如果我的目標是.NET 3.5並且該函數可以正常工作,則會發生。 – siger 2010-11-09 19:52:08

+0

我會嘗試創建一個模仿繼承鏈的新/簡單解決方案,以更清晰地重現問題。 – siger 2010-11-09 19:52:38

+0

JITter在試圖調用該行所調用的方法時試圖加載B.dll。如果該方法或類的靜態ctor引用了B.dll中的類型,則會發生這種情況。 – SLaks 2010-11-09 19:54:03

相關問題