Frage

Ich muss programmgesteuert festzustellen, ob .NET 3.5 installiert ist.Ich dachte, es wäre einfach:

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

Das gibt "2.0.50727.1434" also kein Glück...

In meiner Forschung habe ich, dass es einige eher obskure registry-Schlüssel ich kann sehen, aber ich bin mir nicht sicher, ob das ist der Weg zu gehen.Hat jemand irgendwelche Vorschläge?

War es hilfreich?

Lösung

Sie könnten versuchen:

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

@Nick:Gute Frage, ich werde versuchen, es in ein bisschen.

Kev

Andere Tipps

Das ist, weil technisch .NET 3.5 ist eine Erweiterung für das 2.0-framework.Der Schnellste Weg ist, um eine Montage aus .NET 3.5 und sehen, wenn es bricht.

System.Web.Extensions

Eine gute Montage ist nur in der version 3.5.Auch scheint es, dass Sie mit ASP.NET zum ausführen dieses schauen, das ist wirklich Grenzen, die Sie, weil Sie nicht mehr an überprüfen Sie das Dateisystem oder die Registrierung läuft im geschützten Modus ASP.NET.Oder Sie können immer problematisch laden Sie eine assembly aus dem GAC, sollte das nur in .NET 3.5, aber Sie kann laufen in Probleme mit Berechtigungen wieder.

Möglicherweise ist dies eine jener Zeiten, wo man Fragen selbst "Was versuche ich zu erreichen?" und sehen, ob es alternative Routen.

@Kev, wirklich, wie Ihre Lösung.Danke für die Hilfe.

Mit der Registrierung den code würde wie folgt Aussehen:

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

Ich wäre neugierig, wenn diese funktionieren würde, in einem medium trust environment (obwohl ich arbeite in volles Vertrauen es ist also egal, an was ich gerade arbeite).

@komradekatz, die Ihre Lösung unten von der MSDN-Website für Komfort, für andere in diesen suchen.Ich weiß nicht, wie diese Lösung, weil es verwendet die Benutzer-agent-version zu bestimmen.Dies ist nicht tragbar und für was Brauch ich (ich Schreibe eine Klasse, Bibliothek, wissen muss, ob .NET 3.5 installiert ist).Ich habe auch Fragen, wie zuverlässig diese Lösung erweist.

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

Auf meinem Rechner in diesem Ausgänge:

Diese Maschine hat die richtige version der .NET Framework 3.5.

Diese machine ' s userAgent string is: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).

Ein weiterer interessanter finden, ist das Vorhandensein von Assemblys hier:

C:\Program Files eference Assemblies\Microsoft\Framework\v3.5

Sie würden denken, Microsoft würde, bauen Sie ein Häkchen für "aktuelle version" in den Rahmen.

Wenn Sie möchten zu verlangen, eine bestimmte version .net installiert werden und können die Kontrolle über die Verteilung Ihrer Anwendung, Sie sollten wirklich ClickOnce -.Es ermöglicht Sie zu angeben die mindestens erforderliche version von .Net-framework installiert werden soll, und es wird nur zu überprüfen wenn es ist installiert, so dass alle Ihre spätere Neugründungen werden nicht behindert durch eine unnötige überprüfen.

Auch mit ClickOnce Sie erhalten die Aktualisierung kostenlos.Warum würde jemand wollen, es zu benutzen?

Einrichten einer ClickOnce-Anwendung, nur der rechten Maustaste auf das Projekt in Visual Studio und gehen Sie zu den Einstellungen für Veröffentlichungen.So erstellen Sie einen speziellen build der Anwendung, die Sie auf Ihrer website platzieren können.Wenn Benutzer ein Programm herunterladen, das Installationsprogramm prüft, ob alle erforderlichen Komponenten wie .Net für Sie.

Eine option ist, um zu erkennen 4.0 mit der version string:

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

dann seit 2,0 und 2,5 teilen Sie eine CLR-version und-Nummer, diese müssen distenguished durch überprüfung der Registrierung.Da diese Versionen sind bereits veröffentlicht, die strings zu suchen sind bekannt.

Ohne jegliche Montage-be-und Ausnahmen abfangen (was langsam ist), prüfen Sie die Klasse API-änderungen zwischen 2,0 und 3,5. Mono Class Status ist sehr hilfreich für diese.So können Sie zum Beispiel prüfen GC.Collect Method (Int32, GCCollectionMode) das ist in mscorlib, und wurde Hinzugefügt, 3.5 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top