2009-12-22 87 views
4

我想編寫一個安裝網站並創建IIS虛擬目錄的小型安裝程序應用程序。該應用程序應該在Windows XP/Server 2003(IIS 6)以及Vista/2008(IIS 7)上運行。CLR何時嘗試加載引用程序集?

問題是:對於IIS 6,我們通過調用WMI/Metabase API創建virt dirs,對於IIS 7,有一個更好的API:Microsoft.Web.Administration,但它的程序集僅在IIS 7系統上可用。

幼稚的做法:

... 
if (OperatingSystem == old) 
{ 
    call metabase API... 
} 
else 
{ 
    call Microsoft.Web.Administration... 
} 
... 

不錯,不是嗎?但是,我怎樣才能確保它在嘗試加載Microsoft.Web.Administration DLL時不會在舊系統上崩潰?或者是剛剛加載的程序集,何時首次使用?當第一次使用調用到程序集中的方法時?

我想,如果沒有CLR/.NET規範保證某些確定性,測試就無濟於事。

我非常期待聽到您的經驗,提示或解決方案。到目前爲止,我還沒有在網上找到任何可以遠程使用的東西

回答

1

我一直無法找到明確的答案,因爲在說明何時裝配必須和不能裝載的規範中。然而,根據

http://msdn.microsoft.com/en-us/magazine/cc163655.aspx(參見 「負荷啓動時更少的模塊」)

和在www.informit.com/articles/article.aspx?p=30601 & SEQNUM = 5(摘自書提取「Essential .NET,第一卷:通用語言運行時」)。

只有在需要編譯方法時,CLR的JIT纔會加載所需的程序集。因此,您應該將Microsoft.Web.Administration ...的任何用法移至單獨的方法,該方法僅在您確信系統上存在該程序集時纔會調用。也就是說,

setup() 
    { 
     if (Operating.System == Old) 
      call metabase API 
     else 
      doIIS7Setup() 
    } 

    void doIIS7Setup() 
    { 
    call Microsoft.Web.Administration .... 
    } 
1

個人,而不是試圖依靠JIT的任何內在的行爲,我會移動依賴於Microsoft.Web.Administration到另一個組件完全。

然後,在調用大會的某個地方,我會檢查是否存在%systemroot%\inetsrv\Microsoft.Web.Administration.dll。如果是這樣,那麼我會假設我正在使用託管界面並調用程序集;如果沒有,我會回到元數據庫API。

相關問題