以编程方式检查.NET Framework版本 - 我应该吗?

时间:2014-04-24 12:31:58

标签: c# .net .net-framework-version

我的任务是扩展现有的WinForm应用程序以检查天气是否安装了所需的.NET Framework(fx.3.5)。

问题是 - 如果没有安装.NET Framework,winform程序根本无法运行......我认为。

我可以(也许)像这里建议的那样:(并制作一个应首先启动的c ++程序,进行检查,然后启动应用程序) Check on .Net framework version from WinForms app 但我宁愿不进入c ++。

另一种方式似乎是这个解决方案: Why isn't an exception thrown when the right .NET framework version is not present? ...在app.config中配置应用程序的位置。但我怀疑如果没有安装.NET框架,它会起作用。

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

所以我的问题是这个领域的最佳实践?我应该以某种方式进行检查,还是应该将其作为先决条件,即fx。是否需要.NET Framework 3.5版?

6 个答案:

答案 0 :(得分:2)

如果未安装所需的框架,您的应用程序将无法运行,因此检查框架是否已从您的应用程序中安装,检查您已知道的内容是真实的。

如果你想检查框架是否已安装,你真的需要在一个你知道会存在的.NET版本中编写的bootstrapper exe中执行此操作(如.NET 2,因为它安装在机器上,并且OS)或其他一些语言,如C ++。

您可以检入注册表(HKLM \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP)以查看安装了哪些框架。这可以使用C#或任何其他语言轻松完成。

C#代码是这样的:

var baseKeyName = @"SOFTWARE\Microsoft\NET Framework Setup\NDP";
var installedFrameworkVersions = Registry.LocalMachine.OpenSubKey(baseKeyName);

var versionNames = installedFrameworkVersions.GetSubKeyNames();

答案 1 :(得分:0)

如果您经常为有限的用户群部署,则应查看ClickOnce(http://msdn.microsoft.com/en-us/library/t71a733d(v=vs.80).ASPX

它有点像Windows Installer,但简化了很多。从用户角度看,应用程序看起来像桌面图标。当您单击该图标时,它将自动检查所有要求并安装最新版本的软件(如果已更新)。这样,您可以确保用户始终安装了所需的框架,并且用户始终将使用最新版本。

答案 2 :(得分:0)

要检查.net框架版本,请关注http://support.microsoft.com/kb/318785

答案 3 :(得分:0)

  

我的任务是扩展现有的WinForm应用程序以检查天气是否已安装所需的.NET Framework(fx.3.5)

这没有任何意义,因为如果缺少必需的组件,它将无法运行。

如前所述,通常安装程序负责检查组件,中断安装,下载和安装组件。

但无论如何,没有什么可以阻止你制作 bootstrapper ,它可以在大多数时间运行(也就是说需要更少/无组件)并运行你的.net应用程序。它可以用多种方式组织:exe + exe(经常重命名),exe + dll,exe +嵌入式资源(提取和运行)等......

如果您认为使用MS Visual C ++制作引导程序,那么这对您来说是一个糟糕的新事物:它需要安装组件(是的,这是愚蠢的,但它需要Microsoft Visual C ++ 200x可再发行组件)。因此,它将再次成为安装人员的工作,或者你将不得不学习如何编写C / C ++纯WinAPI软件,这是一个痛苦但可行的。

例如,这是对.Net Framework 4.0的检查

// check if net framework 4.0 or higher is installed
HKEY hkey;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Net Framework Setup\\NDP\\v4", 0, KEY_READ, &hkey) != ERROR_SUCCESS)
    ; // some error
RegCloseKey(hkey);

看起来不复杂吗?然后继续!

答案 4 :(得分:0)

如果未安装所需的.NET版本,那么您运行的程序是正确的。正如其他人所说,你可以使用一个引导程序。您可以简单地让应用程序在运行时失败,并显示默认消息框,该消息框会显示缺少的依赖项。

另一种有效的方法是自己托管CLR。这里:

它也大多像是一个引导程序,但它不是启动第二个(依赖于.NET的)应用程序,而是将它加载到同一个进程中(如果可用)。

答案 5 :(得分:0)

您可以创建批处理(.bat)文件以验证是否存在.NET Framework文件夹:

IF EXIST C:\ WINDOWS \ Microsoft.NET \ Framework [此处为框架版](goto launchprogram)否则转到errormessage