我们有一个面向.NET 3.5的.NET应用程序。我们的客户从共享驱动器(很少)运行它,以便拥有一个中央配置文件位置。
我们注意到,如果工作站访问共享驱动器并运行程序,但没有安装.NET 3.5,则没有任何反应,没有错误,没有异常,没有日志条目,它只是不启动。
为什么没有显示错误消息 在CLR的Windows中?
我有什么东西可以放在 代码的开头会 确保正确的错误消息 显示?
运行安装程序以检查先决条件不是一个选项,因为我们只将其安装在一个中心位置。
感谢。
理想情况下,我们不必使用包装器来查询.NET版本,似乎程序无法启动,而Windows应该在某处报告。我无法相信它会默默地失败。
答案 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到非托管代码之类的操作。如果尝试,您将获得安全例外。
答案 4 :(得分:0)
您可以创建一个批处理文件,首先检查是否安装了正确版本的.NET(请参阅下面的链接),然后启动应用程序并关闭控制台窗口,或者显示错误,而不是直接发布可执行文件。消息和暂停。
Is there a command line command for verifying what version of .NET is installed
答案 5 :(得分:0)
专门回答您的问题:
没有。问自己这个问题:如果框架所需的级别不存在,应该允许(或做出)哪个版本的CLR显示错误消息?
也没有。在应用程序启动之前,没有任何非托管的代码/存根在管理之前运行,因此无法先发制人地检查框架的正确版本。
因此,引导程序或包装程序是您唯一的选择 - 或者您可以查看一次单击应用程序的类型,并查看是否可以使用该程序强制执行(正确框架的)先决条件。