代码之家  ›  专栏  ›  技术社区  ›  sestocker

确定是否安装了.NET 3.5的最佳方法

  •  15
  • sestocker  · 技术社区  · 16 年前

    我需要通过编程确定是否安装了.NET 3.5。我认为这很容易:

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

    它返回“2.0.50727.1434”,所以没有这样的运气…

    在我的研究中,我发现有一些相当模糊的注册表项可以查看,但我不确定这是否是可行的方法。有人有什么建议吗?

    9 回复  |  直到 15 年前
        1
  •  3
  •   Community CDub    7 年前

    你可以试试:

    static bool HasNet35()
    {
        try
        {
            AppDomain.CurrentDomain.Load(
                "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
            return true;
        }
        catch
        {
            return false;
        }
    }
    

    @ Nick 问得好,我再试试。

    千电子伏

        2
  •  3
  •   Nick Berardi    16 年前

    这是因为从技术上讲.NET 3.5是2.0框架的扩展。最快的方法是包含一个来自.NET 3.5的程序集,看看它是否损坏。

    System.Web.Extensions
    

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

    这可能是你问自己“我想完成什么”的时候之一。看看有没有其他的路线。

        3
  •  3
  •   sestocker    16 年前
        4
  •  2
  •   sestocker    16 年前

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

    使用注册表,代码看起来像这样:

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

    我很好奇,是否其中任何一个都能在中等信任的环境中工作(尽管我是在完全信任的环境中工作的,所以这与我目前正在从事的工作无关)。

        5
  •  1
  •   sestocker    16 年前

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

    此计算机的用户代理字符串是: 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)。

        6
  •  1
  •   sestocker    16 年前

    另一个有趣的发现是这里存在程序集:

    C:\程序文件\参考 程序集\Microsoft\Framework\v3.5

    你会认为微软会在框架中构建一个“最新版本”的检查。

        7
  •  1
  •   Jared    15 年前

    如果您希望安装特定版本的.NET,并且可以控制应用程序的分发,则应该真正使用 ClickOnce . 它允许您指定应安装的.NET Framework的最低要求版本,并且仅在安装时进行检查,以便所有后续的启动都不会受到不必要的检查的阻碍。

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

    要设置ClickOnce应用程序,只需右键单击Visual Studio中的项目并转到发布设置。这将创建一个特殊的应用程序构建,您可以将其放置在网站上。当用户下载程序时,安装程序将为您检查.NET等任何先决条件。

        8
  •  1
  •   Phil    15 年前

    一个选项是使用版本字符串检测4.0:

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

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

        9
  •  0
  •   skolima    16 年前

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

    推荐文章