2008-08-19 18 views
15

Necesito determinar programáticamente si está instalado .NET 3.5. Pensé que sería fácil:La mejor forma de determinar si .NET 3.5 está instalado

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

que devuelve "2.0.50727.1434" por lo que no hubo suerte ...

En mi investigación he que hay algunas claves de registro bien oscuros que puedo ver, pero No estoy seguro de si ese es el camino a seguir. ¿Alguien tiene alguna sugerencia?

Respuesta

3

Usted podría 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, voy a tratar de que en un momento.

Kev

+0

Digamos que la próxima semana Microsoft lanza la versión 4.0 y hace todo lo que hizo 3.5, más un poco más. ¿Esto todavía funcionaría? Parece que depende de que 3.5 esté instalado, pero se romperá en una máquina donde se instala una versión más nueva sin instalar 3.5. – Jared

+0

@Jared - Estoy completamente de acuerdo. La detección de la versión del Framework parece bastante desordenada. – Kev

+0

@Jared - y por lo tanto, solo es una sugerencia más que una respuesta definitiva. – Kev

3

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

System.Web.Extensions 

Es un buen conjunto que solo se incluye en la versión 3.5. También parece que está utilizando ASP.NET para ejecutar esta verificación, esto realmente lo limita porque no podrá verificar el sistema de archivos o el registro que se ejecuta en el modo protegido de ASP.NET. O siempre puede intentar cargar de manera problemática un ensamblado del GAC que solo debe estar en .NET 3.5; sin embargo, puede volver a ejecutar problemas con permisos.

Esta puede ser una de esas veces en las que se pregunta: "¿Qué estoy tratando de lograr?" y ver si hay rutas alternativas.

+2

no es System.Web.Extensions parte de ASP.NET AJAX ya, con la versión número 1.0.algo? –

+0

@Michael, sí. Es 1.0.61231.0 – AndyMcKenna

1

@komradekatz, su solución a continuación desde MSDN para su conveniencia para los demás que buscan en esto. No me gusta esta solución porque usa el agente de usuario para determinar la versión. Esto no es viable para lo que necesito (estoy escribiendo una biblioteca de clase que necesita saber si .NET 3.5 está instalado). También me pregunto qué tan confiable puede ser esta solución.

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

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

cadena userAgent de esta máquina 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).

2

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

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

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

Sería curioso si cualquiera de estos sería trabajar en un entorno de confianza medio (aunque estoy trabajando con toda confianza para que no se importa en lo que estoy trabajando actualmente).

1

Otro hallazgo interesante es la presencia de montajes aquí:

C: \ Archivos de programa \ Referencia Asambleas \ Microsoft \ Framework \ v3 .5

Pensarías que Microsoft crearía un cheque para "la última versión" en el ramework.

0

Sin ninguna excepción de carga y captura de ensamblaje (que es lenta), verifique los cambios de API de clase entre 2.0 y 3.5. Mono Class Status es muy útil para esto. Por ejemplo, puede verificar GC.Collect Method (Int32, GCCollectionMode) que está en mscorlib y se agregó en 3.5.

1

Si quiere que se instale una versión específica de .net y puede controlar la distribución de su aplicación, realmente debería usar ClickOnce. Le permite especificar la versión mínima requerida del .Net framework que debe instalarse, y solo comprobará cuándo se está instalando para que todas sus puestas en marcha posteriores no se vean obstaculizadas por una verificación innecesaria.

Además, con ClickOnce se obtiene una actualización de forma gratuita. ¿Por qué no alguien querría usarlo?

Para configurar una aplicación ClickOnce, simplemente haga clic derecho en el proyecto dentro de Visual Studio y vaya a Configuración de publicación. Esto creará una versión especial de su aplicación que puede colocar en su sitio web. Cuando los usuarios descargan el programa, el instalador verificará si hay prerrequisitos como .Net para usted.

+0

Todo muy bien pero en realidad no responde la pregunta del OP. Hay escenarios (que claramente el OP ha encontrado por sí mismo) en los que necesita determinar por programación la versión de marco instalada. – Kev

+0

@Kev, tienes razón. Echando otro vistazo a la pregunta, veo que está buscando verificar * si * está instalado y no * requiere * que se instale.Dejaré mi respuesta aquí con la esperanza de que cualquiera que malinterprete el OP pueda encontrar la respuesta que estaban buscando. – Jared

1

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

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

continuación, desde 2.0 y 2.5 comparten un número de versión de CLR, estos deben ser distenguished comprobando el registro. Como esas versiones ya se han lanzado, se conocen las cadenas que se deben buscar.

Cuestiones relacionadas