我有一个使用Team System API的小型命令行程序。如果计算机上未安装正确的Team System,程序将使用System.IO.FileNotFoundException打印回溯,但它也崩溃并显示标准错误信息:
XXX遇到了问题 需要关闭。我们很抱歉 不便。
我只是希望我的程序将“程序需要Team System 2008”消息打印到控制台并退出而不会崩溃。
根据我的理解,整个加载过程在我的C#代码的第一行运行之前发生。有没有办法控制这个?
答案 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
}
}