2008-08-19 12 views
15

Muszę programowo ustalić, czy zainstalowano .NET 3.5. Myślałem, że to będzie łatwe:Najlepszy sposób, aby określić, czy zainstalowana jest platforma .NET 3.5

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

Które zwraca „2.0.50727.1434”, więc nie ma takiego szczęścia ...

W moich badaniach muszę, że istnieją pewne dość niejasne klucze rejestru mogą patrzę ale Nie jestem pewien, czy to jest trasa. Czy ktoś ma jakieś sugestie?

Odpowiedz

3

można spróbować:

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

@Nick: Dobre pytanie, spróbuję go trochę.

Kev

+0

Powiedzmy, że w przyszłym tygodniu Microsoft wypuści wersję 4.0 i zrobi wszystko, co zrobił 3.5, plus trochę więcej. Czy to nadal działa? Wygląda na to, że opiera się na zainstalowanym 3.5, ale zepsuje się na komputerze, na którym zainstalowana jest nowsza wersja bez instalowania 3.5. – Jared

+0

@Jared - Zgadzam się całkowicie. Wykrywanie wersji szkieletowej wydaje się dość nieporządne. – Kev

+0

@Jared - a więc to tylko sugestia, a nie ostateczna odpowiedź. – Kev

3

To dlatego, że technicznie .NET 3.5 jest rozszerzeniem architektury 2.0. Najszybszym sposobem jest dołączenie złożenia z .NET 3.5 i sprawdzenie, czy się zepsuł.

System.Web.Extensions 

To dobry montaż, który jest uwzględniony tylko w wersji 3.5. Wydaje się również, że używasz ASP.NET do uruchomienia tego sprawdzenia, to naprawdę ogranicza Cię, ponieważ nie będziesz w stanie sprawdzić systemu plików lub rejestru działającego w trybie chronionym ASP.NET. Lub zawsze możesz problematycznie spróbować załadować zestaw z GAC, który powinien być tylko w .NET 3.5, jednak możesz ponownie napotkać problemy z uprawnieniami.

Może to być jeden z tych momentów, w których zadajesz sobie pytanie "Co staram się osiągnąć?" i sprawdź, czy istnieją alternatywne trasy.

+2

nie jest System.Web.Extensions częścią ASP.NET AJAX już, z numerem wersji 1.0.something? –

+0

@Michael, tak. It's 1.0.61231.0 – AndyMcKenna

1

@komradekatz, twoje rozwiązanie poniżej z MSDN dla wygody innych osób zainteresowanych tym. Nie podoba mi się to rozwiązanie, ponieważ używa agenta użytkownika do określenia wersji. Nie jest to opłacalne dla tego, czego potrzebuję (piszę bibliotekę klas, która musi wiedzieć, czy jest zainstalowany .NET 3.5). Zastanawiam się także, jak wiarygodne może być to rozwiązanie.

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

na moim komputerze to wyjścia:

Ta maszyna ma poprawną wersję .NET Framework 3.5.

userAgent ciąg tego urządzenia jest: 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, naprawdę podoba Ci się rozwiązanie. Dzięki za pomoc.

Korzystanie rejestru kod będzie wyglądał mniej więcej tak:

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

byłbym ciekaw, czy którykolwiek z nich będzie pracować w środowisku o średnim zaufania (choć pracuję w pełnym zaufaniu, tak aby nie ważne dla tego, nad czym aktualnie pracuję).

1

Innym ciekawym znalezisko jest obecność zespołów tutaj:

C: \ Program Files \ referencyjny zwoje \ Microsoft \ Framework \ v3 .5

Można by pomyśleć, że Microsoft skonstruowałby czek na "najnowszą wersję" ramework.

0

Bez żadnych wyjątków ładowania i przechwytywania zestawu (która jest wolna), sprawdź, czy zmiany w interfejsie API klasy między 2,0 i 3,5. Mono Class Status jest bardzo pomocny w tym. Na przykład można sprawdzić, czy nie ma w nim pliku GC.Collect Method (Int32, GCCollectionMode) i został on dodany w wersji 3.5.

1

Jeśli chcesz wymagać zainstalowania określonej wersji .net i możesz kontrolować dystrybucję swojej aplikacji, powinieneś naprawdę użyć ClickOnce. Pozwala określić minimalną wymaganą wersję środowiska .Net, która powinna zostać zainstalowana, i będzie sprawdzać tylko, kiedy jest instalowany, aby wszystkie kolejne uruchomienia nie były utrudnione przez niepotrzebne sprawdzenie.

Ponadto za pomocą ClickOnce aktualizacje są bezpłatne. Dlaczego ktoś nie chciałby go użyć?

Aby skonfigurować aplikację ClickOnce, kliknij prawym przyciskiem myszy projekt w programie Visual Studio i przejdź do Ustawień publikowania. Spowoduje to utworzenie specjalnej kompilacji aplikacji, którą możesz umieścić na swojej stronie internetowej. Gdy użytkownicy pobiorą program, instalator sprawdzi, czy są jakieś wymagania wstępne, takie jak .Net.

+0

Wszystko bardzo dobrze, ale tak naprawdę nie odpowiada na pytanie OP. Istnieją scenariusze (które oczywiście OP napotkał dla siebie), gdzie trzeba programowo określić wersję instalacji. – Kev

+0

@Kev, masz rację. Przyjrzawszy się jeszcze raz, widzę, że chce sprawdzić * jeśli * jest zainstalowany, a nie * wymaga * do zainstalowania.Zostawię tutaj odpowiedź w nadziei, że każdy, kto błędnie odczyta OP, może znaleźć odpowiedź, której szukali. – Jared

1

Jedną z opcji jest wykrycie 4,0 za pomocą numeru wersji:

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

następnie od 2.0 i 2.5 mają wiele wersji CLR, muszą one być distenguished poprzez sprawdzenie rejestru. Ponieważ wersje te są już wydane, znane są ciągi do wyszukania.

Powiązane problemy