在Windows 7 / Vista中,我如何检测.NET Framework功能是否“关闭”?

12

我的应用程序需要.NET Framework版本3.5。最近我遇到了一个客户,在Windows Vista(也适用于Windows 7)上已经安装了.NET Framework但却关闭了它。

在这种情况下,我的安装程序(InstallShield 2009)不会提示用户安装该框架(因为它已经安装),当我的应用程序运行时,它立即崩溃。我尝试了另一个.NET应用程序,同样会立即崩溃。

有没有办法检测到这种情况并处理得更加优雅?仅在安装过程中进行检测并不理想,因为.NET Framework可以随时被关闭。理想情况下,该应用程序能够检查并向用户显示友好的消息,告诉他们需要打开.NET Framework。

编辑:在Windows Vista或Windows 7中“关闭”.NET Framework与卸载它不同。该框架可以简单地重新打开而不需要重新安装:http://windows.microsoft.com/en-US/windows-vista/Turn-Windows-features-on-or-off


4
我从未听说过可以关闭.NET Framework。你需要更好地描述情况,最好从客户那里获取更多信息。 - John Saunders
2
我一直以为这样做就相当于卸载。 - dkackman
1
@John,@dkackman。在Windows 7中关闭一个功能并不会卸载该功能,它只是被关闭或禁用了。 - Chris Taylor
只是一个想法。我目前没有时间在我的Windows 7机器上禁用.NET,但可以在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\policy\v2.0附近查找注册表。 如果有任何更改或消失的注册表键与此功能相关,请您尝试检查注册表键而无需提升权限。 - maxwellb
3
如果CLR加载程序能检测到这种状态并友好提示"无法运行该应用程序,因为您已禁用.NET Framework功能。请单击此处管理已启用的功能。"那就太好了。然而,我一直希望在无法解析相关程序集时也能出现类似的提示... - Dan Bryant
显示剩余3条评论
3个回答

8
当我关闭该功能时,指示框架已安装的注册表中的值被删除。您可以检查该值。
请查看: HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.5

谢谢,所以我可以检查注册表键,但我必须从未受管理的启动器中执行,对吧? - John Myczek
是的,不幸的是,由于该功能可以随意开启和关闭,所以没有办法绕过它。 - KevinH

3

看起来你要为你的应用程序编写一个非托管的启动器。卷起袖子,好好学习C++吧 :)


1

哇,我认为这个URL可能有你要找的答案:

http://blogs.msdn.com/astebner/archive/2008/04/04/8358995.aspx

请参阅“如何在部署场景中安装.NET Framework 3.0操作系统组件” 。据我所知,它描述了使用ocsetup来触发Windows打开该功能。祝你好运。
另外,我很好奇ClickOnce安装程序是否会智能地知道该功能是否已关闭(我想它们会)。但由于您正在使用InstallShield,因此您可能需要比ClickOnce更完整的安装程序;o)

我提到的解决方案是针对 .NET 3 的,但我敢打赌你可以在 3.5 上使用同样的方法。 - Jon Onstott

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