2011-11-03 44 views
0

我遇到了一個與程序集加載不同的問題。假設我們有Foo.dll,它引用了強名稱簽名的FooInfra.dll版本1.0.0.0。強名稱的錯誤版本Dll加載成功

我們使用外部可執行文件來加載Foo.dll並在其中調用MyMethod()。由於某種原因,在特定模式下運行exe時,我們稱之爲模式A,即使FooInfra.dll 2.0.0.0版被意外部署,MyMethod()也能成功運行。如果在「模式B」中運行它,我們會得到預期的錯誤,即找不到正確的組件。

我的問題:這怎麼可能?我認爲用強有力的命名組件,必須使用正確的版本。我已經附上了windbg,以確保它不是從模式A的不同位置加載FooInfra.dll,它不是 - 它確實加載了2.0.0.0版本。

是否有可能在模式A中,外部可執行文件顯式加載DLL,繞過MyMethod運行時強名稱檢查,因爲程序集僅加載?

任何關於這個問題或如何調試/診斷的見解將不勝感激。謝謝!

+0

對於自.NET 3.5 SP1開始以完全信任方式運行的應用程序,會跳過強名稱驗證。 –

回答

1

您沒有具體說明負載在不同情況下的差異。另外 - 而不是windbg我會用Fusion來記錄你的程序集加載。它會告訴你什麼路徑被探測,你可以看到它是否完全無視案例2中的強名稱。

沒有更多的技術細節超出了那個提供了很難說。如果foo確實有強名稱的引用(檢入反射器)強命名程序集,也使用強名稱,Id期望它失敗,但可能存在文檔,但是您正在以模式A加載,通過設計它會跳過檢查(再次需要更多詳細信息)

您是否有機會使用-Vr選項? http://www.lookout.net/2006/04/09/bypassing-strong-name-verification-for-a-net-assembly/

+0

由於它是一個外部exe,不幸的是我沒有關於它如何加載的額外信息。我將檢查fuslogvw以瞭解它在每種情況下如何加載它。謝謝! – SpeksETC

+0

Fuslog顯示這兩種模式都無法加載dll,但有一個有另一個使用Assembly.LoadFrom顯示負載的日誌條目。在Assesmbly.LoadFrom中放置一個斷點,我看到在模式A中,一個外部插件被加載,顯式解析了程序集加載問題。謝謝您的幫助! – SpeksETC