Question

Je dois déterminer par programme si .NET 3.5 est installé.Je pensais que ce serait facile:

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

Ce qui renvoie "2.0.50727.1434" donc pas de chance...

Dans mes recherches, j'ai découvert qu'il existe des clés de registre plutôt obscures que je peux consulter, mais je ne sais pas si c'est la voie à suivre.Est-ce que quelqu'un a des suggestions?

Était-ce utile?

La solution

Tu pourrais essayer:

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

@pseudo:Bonne question, je vais l'essayer dans un instant.

Kév

Autres conseils

En effet, techniquement, .NET 3.5 est une extension du framework 2.0.Le moyen le plus rapide consiste à inclure un assembly de .NET 3.5 et à voir s'il se casse.

System.Web.Extensions

Est un bon assembly qui n’est inclus que dans la version 3.5.Il semble également que vous utilisez ASP.NET pour exécuter cette vérification, cela vous limite vraiment car vous ne pourrez pas vérifier le système de fichiers ou le registre exécuté en mode protégé d'ASP.NET.Ou vous pouvez toujours essayer de manière problématique de charger un assembly à partir du GAC qui ne devrait être que dans .NET 3.5, mais vous risquez de rencontrer à nouveau des problèmes d'autorisations.

Cela peut être l'une de ces moments où vous vous demandez "Qu'est-ce que j'essaie d'accomplir?" Et voyez s'il y a d'autres itinéraires.

@Kev, j'aime vraiment votre solution.Merci pour l'aide.

En utilisant le registre, le code ressemblerait à ceci :

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

Je serais curieux de savoir si l'un ou l'autre fonctionnerait dans un environnement de confiance moyenne (même si je travaille en toute confiance, cela n'a donc pas d'importance par rapport à ce sur quoi je travaille actuellement).

@komradekatz, votre solution ci-dessous de MSDN pour plus de commodité pour les autres personnes qui se penchent sur ce sujet.Je n'aime pas cette solution car elle utilise l'agent utilisateur pour déterminer la version.Ce n'est pas viable pour ce dont j'ai besoin (j'écris une bibliothèque de classes qui doit savoir si .NET 3.5 est installé).Je me demande également à quel point cette solution peut s'avérer fiable.

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

Sur ma machine, cela donne :

Cette machine a la version correcte du .NET Framework 3.5.

La chaîne userAgent de cette machine est :Mozilla/4.0 (compatible ;MSIE 7.0 ;WindowsNT6.0 ;SLCC1 ;.NET CLR 2.0.50727;.NET CLR 3.0.04506 ;InfoPath.2 ;.NETCLR 1.1.4322 ;.NET CLR 3.5.21022;Zune 2.5).

Une autre découverte intéressante est la présence d'assemblées ici :

C: Program Files Reference Assemblies Microsoft Framework V3.5

On pourrait penser que Microsoft créerait une vérification de la « dernière version » dans le framework.

Si vous souhaitez exiger l'installation d'une version spécifique de .net et pouvoir contrôler la distribution de votre application, vous devriez vraiment utiliser Cliquez une fois.Il vous permet de spécifier la version minimale requise du framework .Net qui doit être installé, et il ne vérifiera que lors de son installation afin que tous vos démarrages ultérieurs ne soient pas gênés par une vérification inutile.

De plus, avec ClickOnce, vous bénéficiez d'une mise à jour gratuite.Pourquoi personne ne voudrait-il l'utiliser ?

Pour configurer une application ClickOnce, faites un clic droit sur le projet dans Visual Studio et accédez aux paramètres de publication.Cela créera une version spéciale de votre application que vous pourrez placer sur votre site Web.Lorsque les utilisateurs téléchargent le programme, le programme d'installation vérifie pour vous les conditions préalables telles que .Net.

Une option consiste à détecter la version 4.0 à l'aide de la chaîne de version :

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

puis, puisque les versions 2.0 et 2.5 partagent un numéro de version CLR, celles-ci doivent être distinguées en vérifiant le registre.Puisque ces versions sont déjà publiées, les chaînes à rechercher sont connues.

Sans aucun chargement d'assembly ni capture d'exceptions (ce qui est lent), vérifiez les modifications de l'API de classe entre 2.0 et 3.5. Statut de classe mono est très utile pour cela.Par exemple, vous pouvez vérifier GC.Collect Method (Int32, GCCollectionMode) qui est dans mscorlib et a été ajouté dans la version 3.5.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top