2012-07-31 52 views
0

我有三個.NET 4.0的第三方組件:簽名的程序集似乎加載未簽名(不使用反射)

  • Assembly.One是無符號並參照簽署Assembly.Two和無符號Assembly.Three

  • Assembly.Two參考文獻a signedAssembly.Three

我已經使用反射器驗證了上述情況。

我已經提供了一個無符號Assembly.One,簽署Assembly.Two無符號Assembly.Three

我預計這將在部署爲有符號的Assembly.Two時發生崩潰,肯定無法加載未簽名的Assembly.Three,因爲它特別從其引用中查找簽名版本?然而,令我驚訝的是它的工作原理。

Assembly.Two有參考Assembly.Three在它的清單,所以它必須使用它,否則編譯器會剝離出來?我已經檢查過服務器上沒有Assembly.Three的簽名版本,並且使用FUSLOGVW它確實正在加載未簽名的版本。

FUSLOGVW中有兩個條目用於加載未簽名的Assembly.Three,其中一個用於(Unknown)的調用程序集,顯示以下內容。

從應用程序 目錄中成功部分指定的程序集綁定成功。需要重新申請政策

難道還有一個潛在的「責任鏈」(由於沒有一個更好的描述),它允許這一點,我不知道,因爲始發Assembly.One具有的一個參考無符號的Assembly.Three

回答

0

你有app.config,Machine.Config等執行重定向的任何「Configured Assemblies」嗎?或者其他配置的設置來改變行爲?

檢查以確保程序集引用中的「Specific Version = true」。你是否在你的項目中引用了未簽名的Assembly.Three來強制「複製」,但你實際上並沒有直接使用Three?確保Assembly.Two在您的本地參考Three開始之前加載,或者完全不參考三直接讓Two做出該決定。

加載信息在這裏How the Runtime Locates Assemblies從這個信息#2可能是你正在發生的事情。