2008-10-18 87 views
2

我有一個使用Team System API的小命令行程序。當機器上沒有安裝正確的團隊系統,該程序將打印System.IO.FileNotFoundException回溯,但它也崩潰和顯示標準錯誤訊息支付:如何防止未找到引用的程序集時崩潰?

XXX遇到問題, 需要關閉。我們很抱歉 不便。

我只是想讓我的程序打印一個「該程序需要Team System 2008」消息給控制檯並退出而不會崩潰。

從我所瞭解的整個加載過程發生在我的C#代碼的第一行運行之前。有什麼辦法可以控制這個嗎?

回答

3

.NET代碼即時編譯上的方法,通過方法的基礎。你的「Main」方法是否引用外部庫?如果是的話,可以考慮:

[MethodImpl(MethodImplOptions.NoInlining)] 
static int Main() { // add "args" etc if needed 
    try { 
     return Main2(); 
    } catch (Exception ex) { 
     Console.Error.WriteLine(ex.Message); 
     return 1; 
    } 
} 
static int Main2() { // add "args" etc if needed 
    // your real code 
} 

我不能保證它會工作,但它是值得一試...

1

你可以嘗試Override CLR Assembly Probing Logic

在.NET Framework,解決集引用時,對CLR首先檢查GAC,然後搜索特定位置的應用程序目錄。如果程序集不在這些位置之一中,CLR將觸發AssemblyResolve事件。您可以訂閱AssemblyResolve事件並使用Assembly.LoadFrom/LoadFile等返回程序集。

但是,就您而言,您只需顯示您的消息箱,然後以乾淨的方式關閉即可。

0

是的。在第一次使用一個類型時,程序集將被加載,該類型本身引用要加載的程序集中的類型。

因此,解決方案是創建一個輔助類,該類包裝與API的所有交互。然後在try/catch中調用這個包裝類。

是這樣的:

public class Program 
{ 
    static void Main() 
    { 
     try 
     { 
      WrapperClass.CallApi(...); 
     } 
     catch(FileNotFoundException) 
     { 
      ... you can e.g. show a MessageBox and exit here ... 
     } 
    } 
} 

internal class WrapperClass 
{ 
    public void CallApi(...) 
    { 
     ... you can reference types from the Team System assembly in WrapperClass 
    } 
} 
+0

謝謝,但顯然組件加載我的任何代碼運行之前,我可以甚至沒有達到Main的第一行。 – gooli 2008-10-18 12:11:10

+0

是的,因爲你直接在Main方法中引用它。如果你從一個單獨的類引用(或者像Marc Gravell指出的那樣,甚至是一個單獨的方法),你的Main將被執行,你可以捕獲異常。 – Joe 2008-10-18 13:53:39

相關問題