我有一個使用Team System API的小命令行程序。當機器上沒有安裝正確的團隊系統,該程序將打印System.IO.FileNotFoundException回溯,但它也崩潰和顯示標準錯誤訊息支付:如何防止未找到引用的程序集時崩潰?
XXX遇到問題, 需要關閉。我們很抱歉 不便。
我只是想讓我的程序打印一個「該程序需要Team System 2008」消息給控制檯並退出而不會崩潰。
從我所瞭解的整個加載過程發生在我的C#代碼的第一行運行之前。有什麼辦法可以控制這個嗎?
我有一個使用Team System API的小命令行程序。當機器上沒有安裝正確的團隊系統,該程序將打印System.IO.FileNotFoundException回溯,但它也崩潰和顯示標準錯誤訊息支付:如何防止未找到引用的程序集時崩潰?
XXX遇到問題, 需要關閉。我們很抱歉 不便。
我只是想讓我的程序打印一個「該程序需要Team System 2008」消息給控制檯並退出而不會崩潰。
從我所瞭解的整個加載過程發生在我的C#代碼的第一行運行之前。有什麼辦法可以控制這個嗎?
.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
}
我不能保證它會工作,但它是值得一試...
你可以嘗試Override CLR Assembly Probing Logic
在.NET Framework,解決集引用時,對CLR首先檢查GAC,然後搜索特定位置的應用程序目錄。如果程序集不在這些位置之一中,CLR將觸發AssemblyResolve事件。您可以訂閱AssemblyResolve事件並使用Assembly.LoadFrom/LoadFile等返回程序集。
但是,就您而言,您只需顯示您的消息箱,然後以乾淨的方式關閉即可。
是的。在第一次使用一個類型時,程序集將被加載,該類型本身引用要加載的程序集中的類型。
因此,解決方案是創建一個輔助類,該類包裝與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
}
}
謝謝,但顯然組件加載我的任何代碼運行之前,我可以甚至沒有達到Main的第一行。 – gooli 2008-10-18 12:11:10
是的,因爲你直接在Main方法中引用它。如果你從一個單獨的類引用(或者像Marc Gravell指出的那樣,甚至是一個單獨的方法),你的Main將被執行,你可以捕獲異常。 – Joe 2008-10-18 13:53:39