2008-08-19 69 views
15

我需要以编程方式确定是否安装了.NET 3.5。我认为这将是很容易:确定是否安装了.NET 3.5的最佳方式

<% Response.Write(Environment.Version.ToString()); %> 

它返回“2.0.50727.1434”,因此没有这样的运气...

在我的研究我有一些比较模糊的注册表项,我可以看,但我不确定这是否是要走的路线。有没有人有什么建议?

回答

3

你可以尝试:

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

+0

假设下周微软发布4.0版本,它做了3.5所做的一切,再加上一点点。这仍然有效吗?它似乎依赖于正在安装的3.5,但会在没有安装3.5的情况下安装新版本的机器上中断。 – Jared 2009-01-03 14:55:20

3

这是因为技术上.NET 3.5是2.0框架的扩展。最快的方法是从.NET 3.5包含一个程序集并查看它是否中断。

System.Web.Extensions 

是一个很好的程序集,只包含在版本3.5中。此外,似乎您正在使用ASP.NET来运行此检查,这实际上限制了您,因为您将无法检查在ASP.NET的受保护模式下运行的文件系统或注册表。或者,您总是可以尝试从GAC加载只应在.NET 3.5中的程序集,但是您可能会再次遇到权限问题。

这可能是你问自己的那些时间之一“我想要完成什么?”并查看是否有其他路线。

+2

已不是System AJAX AJAX的System.Web.Extensions的一部分,版本号为1.0.something? – 2009-08-12 12:53:13

+0

@迈克尔,是的。这是1.0.61231.0 – AndyMcKenna 2009-10-15 17:50:02

1

@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)。

2

@Kev,真的很喜欢你的解决方案。谢谢您的帮助。

使用注册表中的代码看起来是这样的:

RegistryKey key = Registry 
     .LocalMachine 
     .OpenSubKey("Software\\Microsoft\\NET Framework Setup\\NDP\\v3.5"); 
return (key != null); 

我会好奇,如果这些将在中等信任的环境中工作(虽然我完全信任我工作,所以它不重要的是我目前的工作)。

1

另一个有趣的发现是组件的存在这里:

C:\ Program Files文件\参考 大会\微软\框架\ V3 .5

你会认为微软会在f中建立一个“最新版本”的检查ramework。

0

如果没有任何程序集加载和捕获异常(这很慢),请检查2.0和3.5之间的类API更改。 Mono Class Status对此非常有帮助。例如,您可以检查mscorlib中的GC.Collect Method (Int32, GCCollectionMode),并在3.5中添加。

1

如果您想要安装.net的特定版本并且可以控制应用程序的分发,您应该确实使用ClickOnce。它允许您指定应该安装的.Net框架的最低要求版本,并且它只会检查它的安装时间,以便所有后续启动都不会受到不必要的检查的阻碍。

此外,使用ClickOnce您可以免费更新。为什么有人不想使用它?

要设置ClickOnce应用程序,只需右键单击Visual Studio中的项目,然后转到“发布设置”。这将创建一个特殊版本的应用程序,您可以将其放置在您的网站上。当用户下载程序时,安装程​​序会检查任何先决条件,例如.Net。

1

一种选择是使用的版本字符串来检测4.0:

Environment.Version.CompareTo(new Version(4, 0)); 

然后因为2.0和2.5共享一个CLR版本号,这些都需要通过检查注册表来distenguished。由于这些版本已经发布,所以要查找的字符串是已知的。

相关问题