我们注意到,如果一台工作站访问共享驱动器并运行程序,但没有安装.NET 3.5,则什么也不会发生,没有错误,没有异常,没有日志条目,它只是无法启动。
- 为什么CLR在Windows中没有显示任何错误消息? - 是否有什么我可以放在代码开头的东西来确保显示适当的错误消息?
由于我们只在一个中央位置安装它,因此运行检查先决条件的安装程序不是一个选项。
理想情况下,我们不需要包装器来查询.NET版本,似乎程序无法启动,Windows应该在某个地方报告这一点。我无法相信它会悄悄失败。
<configuration>
<startup>
<supportedRuntime version="v3.5" />
</startup>
</configuration>
我得到了一个漂亮的小对话框,如下所示:
--------------------------- moreverfoo.exe - .NET Framework 初始化错误 --------------------------- 要运行此应用程序,您首先必须安装以下版本之一的.NET Framework: v3.5 联系您的应用程序发布者以获取有关获取适当版本的.NET Framework的说明。 --------------------------- 好的 ---------------------------
我想你可以用C++创建一个应用程序,检查所需的.NET是否已安装。如果没有安装,就显示消息框;如果已安装,则从共享驱动器运行所需的程序。
当应用程序无法启动时,事件日志中是否有任何条目?很难相信,虽然我认为不是不可能,它会完全无声地失败。也许您的应用程序实际上在第一个表单加载之前生成异常,默默地吞噬它(空catch块),然后退出,所有这些都没有任何记录或错误消息。
此外,通常无法在网络共享上运行.NET应用程序,因为它是“不受信任的位置”,过去我总是遇到安全异常。
如果一台机器已经安装了.NET 3.5 SP1(就像您的开发机器一样),那么您可以从网络共享运行.NET应用程序,它将正常运行,并具有完全信任。但这是3.5 SP1中的新功能 - 在原始的3.5版本中甚至都不是真实的。在3.5 SP1之前,如果您尝试从网络共享运行应用程序,则会以受限权限运行。
由于这些机器没有3.5,所以可以肯定它们没有3.5 SP1。因此,您的应用程序将无法执行诸如打开文件或P/Invoke到非托管代码等操作。如果尝试,您将收到安全性异常。
不要直接发布可执行文件,你可以创建一个批处理文件,在启动应用程序之前先检查是否安装了正确版本的.NET(参见下面的链接),然后要么启动应用程序并关闭控制台窗口,要么显示错误消息并暂停。
具体回答你的问题:
不行。 问问自己一个问题:如果所需框架的级别不存在,应该允许哪个版本的CLR显示错误消息(或者强制使用哪个版本)?
也不行。 在您的应用程序启动之前,没有运行未管理的代码/存根的方式来预先检查正确的框架版本。
因此,引导程序或包装器是您唯一的选择 - 或者您可以查看一种“单击一次”类型的应用程序,并查看是否可以使用它来强制执行(正确的框架的)先决条件。