当没有正确的.NET框架版本时,为什么不抛出异常?

时间:2010-04-27 21:20:08

标签: .net version

我们有一个面向.NET 3.5的.NET应用程序。我们的客户从共享驱动器(很少)运行它,以便拥有一个中央配置文件位置。

我们注意到,如果工作站访问共享驱动器并运行程序,但没有安装.NET 3.5,则没有任何反应,没有错误,没有异常,没有日志条目,它只是不启动。

  • 为什么没有显示错误消息 在CLR的Windows中?

  • 我有什么东西可以放在 代码的开头会 确保正确的错误消息 显示?

运行安装程序以检查先决条件不是一个选项,因为我们只将其安装在一个中心位置。

感谢。


理想情况下,我们不必使用包装器来查询.NET版本,似乎程序无法启动,而Windows应该在某处报告。我无法相信它会默默地失败。

6 个答案:

答案 0 :(得分:10)

尝试这样的app.config;

<configuration>
    <startup>
        <supportedRuntime version="v3.5" />
    </startup>
</configuration>

我得到了一个很好的小对话框,就像这样;

---------------------------
moreverfoo.exe - .NET Framework Initialization Error
---------------------------
To run this application, you first must install one of the following 
versions of the .NET Framework:
  v3.5
Contact your application publisher for instructions about obtaining the 
appropriate version of the .NET Framework.
---------------------------
OK   
---------------------------

答案 1 :(得分:1)

我想你可以在C ++中创建app,它会检查是否安装了所需的.NET。如果没有,请显示您的消息框,如果已安装,则应用程序将从共享驱动器运行您需要的程序。

答案 2 :(得分:1)

当应用程序未启动时,事件日志中是否有任何条目?尽管我认为并非不可能,但很难相信它会完全无声地失败。也许你的应用程序实际上是在加载第一个表单之前生成异常,静默地吞下它(空的catch块)然后退出,所有这些都没有任何记录或错误消息。

此外,您通常无法通过网络共享运行.NET应用程序,因为它是“不受信任的位置”,并且我过去总是遇到安全性异常。

答案 3 :(得分:1)

如果某台机器安装了.NET 3.5 SP1(可能是您的开发机器),那么您可以从网络共享运行.NET应用程序,它将以完全信任的方式正常运行。但这是new in 3.5 SP1 - 在最初的3.5版本中它甚至都不是真的。在3.5 SP1之前,如果您尝试从网络共享运行应用程序,它将以受限制的权限运行。

由于这些机器没有3.5,所以可以肯定他们没有3.5 SP1。因此,您的应用程序将无法执行诸如打开文件或P / Invoke到非托管代码之类的操作。如果尝试,您将获得安全例外。

  • 将EXE复制到这些计算机上的本地硬盘驱动器并从那里运行时会发生什么?
  • 如果您的应用在启动时获得安全例外,会发生什么?你自己的代码是否以某种方式掩盖了异常?

答案 4 :(得分:0)

您可以创建一个批处理文件,首先检查是否安装了正确版本的.NET(请参阅下面的链接),然后启动应用程序并关闭控制台窗口,或者显示错误,而不是直接发布可执行文件。消息和暂停。

Is there a command line command for verifying what version of .NET is installed

答案 5 :(得分:0)

专门回答您的问题:

  • 没有。问自己这个问题:如果框架所需的级别不存在,应该允许(或做出)哪个版本的CLR显示错误消息?

  • 也没有。在应用程序启动之前,没有任何非托管的代码/存根在管理之前运行,因此无法先发制人地检查框架的正确版本。

因此,引导程序或包装程序是您唯一的选择 - 或者您可以查看一次单击应用程序的类型,并查看是否可以使用该程序强制执行(正确框架的)先决条件。