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

确定是否的最佳方法。NET 3.5已安装

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

    我需要用程序来确定是否。NET 3.5已安装。我以为这很容易:

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

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

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

    9 回复  |  直到 17 年前
        1
  •  3
  •   Community CDub    8 年前

    你可以试试:

    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

        2
  •  3
  •   Nick Berardi    17 年前

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

    System.Web.Extensions
    

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

    这可能是你问自己“我想实现什么?”并看看是否有其他途径的时候之一。

        3
  •  3
  •   sestocker    17 年前
        4
  •  2
  •   sestocker    17 年前

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

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

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

    我很好奇这两种方法中的任何一种是否适用于中等信任的环境(尽管我是在完全信任的环境中工作的,所以这对我目前正在做的事情并不重要)。

        5
  •  1
  •   sestocker    17 年前

    @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; .导航战鉴定小组 CLR 3.5.21022;Zune 2.5)。

        6
  •  1
  •   sestocker    17 年前

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

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

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

        7
  •  1
  •   Jared    16 年前

    如果你想要求安装特定版本的.net,并且可以控制应用程序的分发,你应该真正使用 ClickOnce 。它允许您指定所需的最低版本。Net framework应该安装,它只会在安装时进行检查,这样所有后续的启动都不会受到不必要的检查的阻碍。

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

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

        8
  •  1
  •   Phil    15 年前

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

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

    那么由于2.0和2.5共享CLR版本号,因此需要通过检查注册表来扩展这些版本号。由于这些版本已经发布,因此要查找的字符串是已知的。

        9
  •  0
  •   skolima    17 年前

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