我需要以编程方式确定是否安装了.NET 3.5。我认为这将是很容易:确定是否安装了.NET 3.5的最佳方式
<% Response.Write(Environment.Version.ToString()); %>
它返回“2.0.50727.1434”,因此没有这样的运气...
在我的研究我有一些比较模糊的注册表项,我可以看,但我不确定这是否是要走的路线。有没有人有什么建议?
我需要以编程方式确定是否安装了.NET 3.5。我认为这将是很容易:确定是否安装了.NET 3.5的最佳方式
<% Response.Write(Environment.Version.ToString()); %>
它返回“2.0.50727.1434”,因此没有这样的运气...
在我的研究我有一些比较模糊的注册表项,我可以看,但我不确定这是否是要走的路线。有没有人有什么建议?
你可以尝试:
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
这是因为技术上.NET 3.5是2.0框架的扩展。最快的方法是从.NET 3.5包含一个程序集并查看它是否中断。
System.Web.Extensions
是一个很好的程序集,只包含在版本3.5中。此外,似乎您正在使用ASP.NET来运行此检查,这实际上限制了您,因为您将无法检查在ASP.NET的受保护模式下运行的文件系统或注册表。或者,您总是可以尝试从GAC加载只应在.NET 3.5中的程序集,但是您可能会再次遇到权限问题。
这可能是你问自己的那些时间之一“我想要完成什么?”并查看是否有其他路线。
已不是System AJAX AJAX的System.Web.Extensions的一部分,版本号为1.0.something? – 2009-08-12 12:53:13
@迈克尔,是的。这是1.0.61231.0 – AndyMcKenna 2009-10-15 17:50:02
@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>
在我的机器这个输出:
本机具有.NET Framework 3.5的正确 版本。
本机的userAgent字符串:Mozilla的 /4.0(兼容; 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)。
@Kev,真的很喜欢你的解决方案。谢谢您的帮助。
使用注册表中的代码看起来是这样的:
RegistryKey key = Registry
.LocalMachine
.OpenSubKey("Software\\Microsoft\\NET Framework Setup\\NDP\\v3.5");
return (key != null);
我会好奇,如果这些将在中等信任的环境中工作(虽然我完全信任我工作,所以它不重要的是我目前的工作)。
另一个有趣的发现是组件的存在这里:
C:\ Program Files文件\参考 大会\微软\框架\ V3 .5
你会认为微软会在f中建立一个“最新版本”的检查ramework。
如果没有任何程序集加载和捕获异常(这很慢),请检查2.0和3.5之间的类API更改。 Mono Class Status对此非常有帮助。例如,您可以检查mscorlib中的GC.Collect Method (Int32, GCCollectionMode)
,并在3.5中添加。
如果您想要安装.net的特定版本并且可以控制应用程序的分发,您应该确实使用ClickOnce。它允许您指定应该安装的.Net框架的最低要求版本,并且它只会检查它的安装时间,以便所有后续启动都不会受到不必要的检查的阻碍。
此外,使用ClickOnce您可以免费更新。为什么有人不想使用它?
要设置ClickOnce应用程序,只需右键单击Visual Studio中的项目,然后转到“发布设置”。这将创建一个特殊版本的应用程序,您可以将其放置在您的网站上。当用户下载程序时,安装程序会检查任何先决条件,例如.Net。
一种选择是使用的版本字符串来检测4.0:
Environment.Version.CompareTo(new Version(4, 0));
然后因为2.0和2.5共享一个CLR版本号,这些都需要通过检查注册表来distenguished。由于这些版本已经发布,所以要查找的字符串是已知的。
假设下周微软发布4.0版本,它做了3.5所做的一切,再加上一点点。这仍然有效吗?它似乎依赖于正在安装的3.5,但会在没有安装3.5的情况下安装新版本的机器上中断。 – Jared 2009-01-03 14:55:20