如何在找不到引用的程序集时防止崩溃?

时间:2008-10-18 11:10:29

标签: .net

我有一个使用Team System API的小型命令行程序。如果计算机上未安装正确的Team System,程序将使用System.IO.FileNotFoundException打印回溯,但它也崩溃并显示标准错误信息:

  

XXX遇到了问题   需要关闭。我们很抱歉   不便。

我只是希望我的程序将“程序需要Team System 2008”消息打印到控制台并退出而不会崩溃。

根据我的理解,整个加载过程在我的C#代码的第一行运行之前发生。有没有办法控制这个?

3 个答案:

答案 0 :(得分:3)

.NET代码在逐个方法的基础上进行JIT。您的“主要”方法是否引用了外部库?如果是这样,请考虑:

[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 :(得分:1)

您可以尝试Override CLR Assembly Probing Logic

在.Net框架中,在解析程序集引用时,CLR首先检查GAC,然后在特定位置搜索应用程序目录。如果程序集不在其中一个位置,CLR将触发AssemblyResolve事件。您可以订阅 AssemblyResolve 事件并使用Assembly.LoadFrom / LoadFile等返回程序集。

但是,在您的情况下,您可以只显示消息框,然后干净地关闭。

答案 2 :(得分: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
    }
}