ver tengo saber que net necesita instalar instalado framework debo como .net .net-3.5 installer registry

.net - tengo - que net framework debo instalar en windows 7



La mejor forma de determinar si.NET 3.5 está instalado (9)

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

Usando el registro, el código se vería así:

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

Me gustaría saber si alguno de estos podría funcionar en un entorno de confianza medio (aunque estoy trabajando con plena confianza, por lo que no importa en qué estoy trabajando actualmente).

Necesito determinar programáticamente 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 tuve tanta suerte ...

En mi investigación, tengo que hay algunas claves de registro bastante oscuras que puedo ver, pero no estoy seguro de si ese es el camino a seguir. ¿Alguien tiene alguna sugerencia?


@komradekatz, su solución a continuación desde MSDN para su conveniencia para los demás que buscan 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 salida:

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

La 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).


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 ensamblaje 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.

Este puede ser uno de esos momentos en los que te preguntas a ti mismo "¿Qué estoy tratando de lograr?" y ver si hay rutas alternativas.


Otro hallazgo interesante es la presencia de asambleas aquí:

C: / Archivos de programa / Conjuntos de referencia / Microsoft / Framework / v3.5

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



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


Si desea que se instale una versión específica de .net y puede controlar la distribución de su aplicación, realmente debería utilizar 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 puede obtener actualizaciones 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 la 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.


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

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

luego, dado que 2.0 y 2.5 comparten un número de versión de CLR, estos deben ser disimulados al verificar el registro. Como esas versiones ya se han lanzado, se conocen las cadenas que se deben buscar.


Tu podrías 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, lo intentaré un poco.

Kev