如果未安装.NET 3.5,如何避免FileNotFoundException?

时间:2008-11-17 09:16:27

标签: .net .net-3.5

如果您尝试在未安装此版本.NET Framework的Windows计算机上启动.NET 3.5应用程序,则会为某些系统程序集获取FileNotFoundException(例如System.Core 3.5。 0.0)。

是否有可能捕获此异常并告诉用户升级他们的.NET框架,或者它是否过早抛出它?

3 个答案:

答案 0 :(得分:3)

最简单的事情就是尝试它。 (我没有任何非3.5机器来测试它,但我认为你这样做。)

使您的入口点变得非常简单,只是尝试加载System.Core.dll并适当地处理异常。如果它通过,则转到另一个可以使用它的类。如果失败,请提供相应的错误消息并退出。

怀疑你不需要具有这种级别的隔离 - 只要你没有任何不可用类型的字段,我就不希望汇编是解决,直到你第一次调用需要它的方法。我必须通过C#咨询CLR来检查。但是,保持它相当孤立可能会更安全 - 它可以避免您以后意外地引入依赖关系。哎呀,你甚至可以把你的“引导和检查”类型放在一个单独的组件中,如果一切正常的话,它只会启动另一个组件。

答案 1 :(得分:3)

您目前如何部署该应用? ClickOnce可以在启动之前进行汇编(GAC)检查,使用msi,您应该有一系列可用的预检查选项......虽然并不总是可行,但您可以考虑使用其中一个部署选项吗?

重新捕获异常 - 只需确保将Main拆分为 nothing 除了捕获异常 - 否则JIT可以阻止Main加载:

// [STAThread] here if winform
[MethodImpl(MethodImplOptions.NoInlining)]
static void Main() {
    try {
       MainCore();
    } catch (SomeException ex) {
       // TODO something simple but fun
    }
}

static void MainCore() { ... } // your app here...

如果在主外部放置太多,它可以在运行任何之前进行barf,因为JIT可能需要这些类型。

答案 2 :(得分:2)

你可以抓住那个例外,是的。

在您的主程序中,只需在主消息循环周围使用try..catch。

try
{
   Application.Run(new MainForm());
}
catch (Exception ex)
{ 
    if (ex.MessageContains("Could not load file or assembly 'System.Core, Version=3.5.0.0"))
    {
        MessageBox.Show("This product requires the Microsoft .NET Framework version 3.5, or greater, in order to run.\n\nPlease contact your System Administrator for more information.");
    }
}