Pregunta

Necesito determinar mediante programación si .NET 3.5 está instalado.Pensé que iba a ser fácil:

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

Que devuelve "2.0.50727.1434" así que no hay tal suerte...

En mi investigación he que hay algunas más oscuras claves del registro que puedo mirar, pero no estoy seguro si ese es el camino a seguir.¿Alguien tiene alguna sugerencia?

¿Fue útil?

Solución

Puedes intentar:

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

@Nick:Buena pregunta, yo voy a probar un poco.

Kev

Otros consejos

Eso es porque técnicamente .NET 3.5 es una extensión del framework 2.0.La forma más rápida de hacerlo es incluir un ensamblado de .NET 3.5 y a ver si se rompe.

System.Web.Extensions

Es un buen ensamblaje de la que sólo se incluye en la versión 3.5.También parece que usted está usando ASP.NET para ejecutar esta comprobación, esto realmente los límites de usted, porque usted no será capaz de comprobar el sistema de archivos o el registro que se ejecuta en el modo protegido de ASP.NET.O usted puede siempre es problemático tratar de cargar un ensamblado de la GAC, que sólo debe estar en .NET 3.5, sin embargo, usted puede ejecutar en problemas con los permisos de nuevo.

Este puede ser uno de esos momentos en los que usted consulte con su auto "Lo que estoy tratando de lograr?" y ver si hay rutas alternativas.

@Kev, me gusta mucho su solución.Gracias por la ayuda.

Mediante el registro el código sería algo como esto:

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

Yo sería curioso si cualquiera de estos iba a funcionar en medio de un entorno de confianza (aunque estoy trabajando en la plena confianza de manera que no importa a lo que actualmente estoy trabajando).

@komradekatz, su solución por debajo de MSDN para la comodidad de los demás sobre esto.No me gusta esta solución, ya que utiliza el agente de usuario para determinar la versión.Esto no es viable para lo que yo necesito (estoy escribiendo una biblioteca de clases que necesita saber si .NET 3.5 está instalado).Yo también la pregunta de qué tan confiable es esta solución puede llegar a ser.

<%@ 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>

En mi máquina esta salida:

Esta máquina tiene la versión correcta de la .NET Framework 3.5.

Esta máquina de la cadena de agente de usuario es: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).

Otro interesante hallazgo es la presencia de asambleas aquí:

C:\Program \Archivos De Referencia Asambleas\Microsoft\Framework\v3.5

Se podría pensar que Microsoft construir un cheque por "última versión" en el marco.

Si usted desea solicitar una versión específica de .net para ser instalado y control de la distribución de su aplicación, usted realmente debería usar ClickOnce.Le permite especificar la versión mínima requerida de la .Net framework que se deben instalar, y que sólo va a comprobar cuando se está instalado de modo que todos sus posteriores inicios no están impedidos por una comprobación innecesaria.

También, con ClickOnce obtener la actualización de forma gratuita.¿Por qué no alguien quiere usarlo?

Para configurar una aplicación ClickOnce, simplemente haga clic derecho sobre el proyecto en Visual Studio y vaya a la Configuración de Publicación.Esto creará una versión especial de su aplicación que usted puede colocar en su sitio web.Cuando los usuarios descargar el programa, el instalador comprobará los requisitos previos similares .Red para usted.

Una opción es detectar 4.0 mediante la cadena de versión:

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

entonces a partir de la 2.0 y 2.5 compartir un número de versión de CLR, estos deben ser distenguished comprobando el registro.Ya que esas versiones son liberados ya de las cadenas a buscar son conocidos.

Sin ningún tipo de montaje de carga y captura de excepciones (que es lento), de verificación para la API de la clase de cambios entre 2.0 y 3.5. Mono Condición De Clase es muy útil para esto.Por ejemplo, usted puede comprobar para GC.Collect Method (Int32, GCCollectionMode) que es en mscorlib y se agregó en 3.5 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top