2011-07-27 31 views
6

我的應用程序包含對外部庫(SQL Server管理對象)的引用。顯然,如果庫在運行時系統上不存在,只要沒有使用來自該庫的類的方法調用,該應用程序仍然工作如何在運行時檢測缺少的.NET引用?

問題1:這是CLR加載庫方式的特定行爲還是(幸運的)副作用?

爲了檢測參考是否可以訪問,我目前使用這樣的代碼:

Function IsLibraryAvailable() As Boolean 
    Try 
     TestMethod() 
    Catch ex As FileNotFoundException 
     Return False 
    End Try 
    Return True 
End Function 

Sub TestMethod() 
    Dim srv As New Smo.Server() ' Try to create an object in the library 
End Sub 

它的工作原理,但它似乎是相當難看。請注意,它只適用於TestMethod是單獨的方法,否則將拋出開始IsLibraryAvailable(在try-catch之前,即使try-catch塊內發生對象實例化)也會發生異常。

問題2:是否有更好的選擇?

特別是,我擔心像函數內聯這樣的優化會阻止我的代碼工作。

+1

當庫不可用時,觸發動態編譯(以及類似事件)的事情可能會導致看似無關的代碼失敗。例如,序列化/反序列化,當一個看起來不相關的引用程序集丟失時,ASP.NET Profile功能失敗了。它創建非常非常困難的調試問題。 – MatthewMartin

+0

@MthethewMartin:謝謝,很高興知道。 – Heinzi

回答

4

這是預期的,因爲JIT在每個方法級別上都很懶。請注意,內聯在這裏不是問題,因爲這也是JIT關心的問題,而不是編譯器的問題。

更好的選擇:

  • 確保安裝該應用程序的一切,它使用ilmerge需要
  • 或類似以創建單個組件(如果可能)

個人而言,我只需使用第一個選項。