确定是否安装了.NET 3.5的最佳方法
我需要以编程方式确定是否已安装.NET 3.5. 我认为这很容易:
<% Response.Write(Environment.Version.ToString()); %>
它返回" 2.0.50727.1434",所以没有这种运气...
在我的研究中,我可以看到一些相当晦涩的注册表项,但是我不确定这是否是可行的方法。有没有人有什么建议?
解决方案
回答
这是因为从技术上讲.NET 3.5是2.0框架的扩展。最快的方法是包括来自.NET 3.5的程序集,然后查看其是否损坏。
System.Web.Extensions
是一个很好的程序集,仅包含在版本3.5中。同样,似乎我们正在使用ASP.NET来运行此检查,这确实限制了我们,因为我们将无法检查以ASP.NET的受保护模式运行的文件系统或者注册表。或者,我们总是可以有问题地尝试从仅应在.NET 3.5中的GAC加载程序集,但是我们可能会再次遇到权限问题。
这可能是我们问自己"我要完成什么?"的时候之一。看看是否有其他路线。
回答
@komradekatz,我们在MSDN上提供的以下解决方案,以方便其他关注此问题的人。我不喜欢这种解决方案,因为它使用用户代理来确定版本。这对于我需要的是不可行的(我正在编写一个类库,需要了解是否已安装.NET 3.5)。我也质疑这种解决方案的可靠性。
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <HTML> <HEAD> <TITLE>Test for the .NET Framework 3.5</TITLE> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8" /> <SCRIPT LANGUAGE="JavaScript"> <!-- var dotNETRuntimeVersion = "3.5.0.0"; function window::onload() { if (HasRuntimeVersion(dotNETRuntimeVersion)) { result.innerText = "This machine has the correct version of the .NET Framework 3.5." } else { result.innerText = "This machine does not have the correct version of the .NET Framework 3.5." + " The required version is v" + dotNETRuntimeVersion + "."; } result.innerText += "\n\nThis machine's userAgent string is: " + navigator.userAgent + "."; } // // Retrieve the version from the user agent string and // compare with the specified version. // function HasRuntimeVersion(versionToCheck) { var userAgentString = navigator.userAgent.match(/.NET CLR [0-9.]+/g); if (userAgentString != null) { var i; for (i = 0; i < userAgentString.length; ++i) { if (CompareVersions(GetVersion(versionToCheck), GetVersion(userAgentString[i])) <= 0) return true; } } return false; } // // Extract the numeric part of the version string. // function GetVersion(versionString) { var numericString = versionString.match(/([0-9]+)\.([0-9]+)\.([0-9]+)/i); return numericString.slice(1); } // // Compare the 2 version strings by converting them to numeric format. // function CompareVersions(version1, version2) { for (i = 0; i < version1.length; ++i) { var number1 = new Number(version1[i]); var number2 = new Number(version2[i]); if (number1 < number2) return -1; if (number1 > number2) return 1; } return 0; } --> </SCRIPT> </HEAD> <BODY> <div id="result" /> </BODY> </HTML>
在我的机器上,输出:
This machine has the correct version of the .NET Framework 3.5. This machine's userAgent string is: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; InfoPath.2; .NET CLR 1.1.4322; .NET CLR 3.5.21022; Zune 2.5).
回答
我们可以尝试:
static bool HasNet35() { try { AppDomain.CurrentDomain.Load( "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); return true; } catch { return false; } }
@Nick:好问题,我会再尝试。
凯夫
回答
@Kev,真的很喜欢解决方案。谢谢帮助。
使用注册表,代码如下所示:
RegistryKey key = Registry .LocalMachine .OpenSubKey("Software\Microsoft\NET Framework Setup\NDP\v3.5"); return (key != null);
我很好奇这两个方法是否都可以在中等信任度的环境中工作(尽管我在完全信任的情况下工作,所以与我当前的工作无关紧要)。
回答
我发现了一个很好的资源:
http://www.walkernews.net/2008/05/16/how-to-check-net-framework-version-installed/
回答
另一个有趣的发现是这里存在程序集:
C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5
我们可能会认为Microsoft将在框架中构建对"最新版本"的检查。
回答
没有任何程序集加载和捕获异常(这很慢),请检查2.0和3.5之间的类API更改。 Mono类状态对此非常有帮助。例如,我们可以检查mscorlib中并在3.5中添加的GC.Collect方法(Int32,GCCollectionMode)
。
回答
如果要安装特定版本的.net并可以控制应用程序的分发,则应真正使用ClickOnce。它允许我们指定应该安装的.Net框架的最低要求版本,并且仅检查何时安装该框架,这样就可以避免不必要的检查阻止所有后续启动。
此外,借助ClickOnce,我们可以免费进行更新。为什么有人不想使用它?
要设置ClickOnce应用程序,只需在Visual Studio中右键单击该项目,然后转到"发布设置"。这将为应用程序创建一个特殊的版本,我们可以将其放置在网站上。当用户下载程序时,安装程序将为我们检查是否有任何准备工作,例如.Net。
回答
一种选择是使用版本字符串检测4.0:
Environment.Version.CompareTo(new Version(4, 0));
那么由于2.0和2.5共享CLR版本号,因此需要通过检查注册表来区分它们。由于这些版本已经发布,因此要查找的字符串是已知的。