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

6
我们有一个.NET应用程序,它的目标是.NET 3.5。我们的客户从共享驱动器(很少)运行它,以便拥有一个集中的配置文件位置。
我们注意到,如果一台工作站访问共享驱动器并运行程序,但没有安装.NET 3.5,则什么也不会发生,没有错误,没有异常,没有日志条目,它只是无法启动。
- 为什么CLR在Windows中没有显示任何错误消息? - 是否有什么我可以放在代码开头的东西来确保显示适当的错误消息?
由于我们只在一个中央位置安装它,因此运行检查先决条件的安装程序不是一个选项。
理想情况下,我们不需要包装器来查询.NET版本,似乎程序无法启动,Windows应该在某个地方报告这一点。我无法相信它会悄悄失败。
6个回答

10
尝试像这样使用您的 app.config;
<configuration>
    <startup>
        <supportedRuntime version="v3.5" />
    </startup>
</configuration>

我得到了一个漂亮的小对话框,如下所示:

---------------------------
moreverfoo.exe - .NET Framework 初始化错误
---------------------------
要运行此应用程序,您首先必须安装以下版本之一的.NET Framework:
  v3.5
联系您的应用程序发布者以获取有关获取适当版本的.NET Framework的说明。
---------------------------
好的   
---------------------------

1

我想你可以用C++创建一个应用程序,检查所需的.NET是否已安装。如果没有安装,就显示消息框;如果已安装,则从共享驱动器运行所需的程序。


1

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

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


它似乎在静默地吞咽着它。根据客户端的不同,网络共享可能不是个问题,用户将被提示它是不受信任的,但他们仍然能够启动它。 - Nate Heinrich
自.NET 3.5 SP1版本开始,从网络共享运行的.NET应用程序与本机应用程序具有相同的行为,因为它们以完全信任方式运行。详情请参见http://blogs.msdn.com/brada/archive/2008/08/13/net-framework-3-5-sp1-allows-managed-code-to-be-launched-from-a-network-share.aspx。 - Dirk Vollmar

1

如果一台机器已经安装了.NET 3.5 SP1(就像您的开发机器一样),那么您可以从网络共享运行.NET应用程序,它将正常运行,并具有完全信任。但这是3.5 SP1中的新功能 - 在原始的3.5版本中甚至都不是真实的。在3.5 SP1之前,如果您尝试从网络共享运行应用程序,则会以受限权限运行。

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

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

谢谢提供这些信息。我没有意识到从网络共享运行会遇到这些问题。+1 - Nate Heinrich

0

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

有没有命令行命令可以验证安装的.NET版本


这是一个好主意,我想我真正寻找的是为什么没有任何错误,对我来说程序默默失败似乎很奇怪。 - Nate Heinrich

0

具体回答你的问题:

  • 不行。 问问自己一个问题:如果所需框架的级别不存在,应该允许哪个版本的CLR显示错误消息(或者强制使用哪个版本)?

  • 也不行。 在您的应用程序启动之前,没有运行未管理的代码/存根的方式来预先检查正确的框架版本。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接