Announcement

Collapse
No announcement yet.

Version auslesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Version auslesen

    Guten morgen,
    ich möchte die, in meinem Projekt, benutzte Frameworkversion auslesen und anzeigen.
    Ich arbeite mit VB 2010. Dort kann man unter Projekteigenschaften - Kompilieren - Erweiterte Kompilierungsoptionen das Zielframework einstellen.
    Ich habe bisher unter VB 2005 die Frameworkversion wie folgt ausgelesen:
    Code:
    System.Environment.Version.ToString
    Wenn ich dies nun unter VB 2010 mache und das Framework 3.0 einstelle, wird die Version des 2er Frameworks angezeigt. Was mir aufgefalles ist, dass das 2er in allen Versionen auch 3.5 so angezeigt wird. Erst ab dem Framework 4 wird die Version wieder richtig dargestellt.

    Gibt es eine andere Möglichkeit die benutzte Frameworkversion anzeigen zu lassen, sodass ich das richtige Ergebnis bekomme?


    Schon mal vielen Dank für eure Antworten...

  • #2
    Hallo,

    warum die 2er angezeigt wird liegt daran, dass .net 3.0 und .net 3.5 ein "in place update" von .net 2.0 ist und die .net 2.0 CLR verwendet. Die Ausgabe ist aus dieser Sicht also korrekt.

    Damit du aber erreichst was du willst, kannst du die Version einer .net Assembly auslesen. Z.B.:
    [highlight=c#]
    public static Version GetCurrentFrameworkVersion()
    {
    return Assembly
    .GetExecutingAssembly()
    .GetReferencedAssemblies()
    .Where(asm => asm.Name == "System.Core")
    .Select(asm => asm.Version)
    .FirstOrDefault();
    }
    [/highlight]
    Dabei setzte ich voraus, dass "System.Core" referenziert ist und das ist wohl so gut wie immer der Fall.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Es gibt keine 3er oder 3.5er CLR. Insofern ist auch wenn 3 oder 3.5 installiert ist die verwendete Runtime immer 2.0. Ob du die zusätzlichen Bibliotheken die 3.0 oder 3.5 mitgeliefert hat benutzt solltest du selber wissen.
      Welches Framewerk installiert ist kannst du über die Registry ermitteln.


      Edit:
      Dabei setzte ich voraus, dass "System.Core" referenziert ist und das ist wohl so gut wie immer der Fall.
      Bei einer gegen 2.0 geschrieben Anwendung eher nicht auch wenn sie nun z.B. gegen ein 3.5 (aka 2.0 SP2) läuft.
      Zuletzt editiert von Ralf Jansen; 29.10.2013, 14:11.

      Comment


      • #4
        @gfoidl
        Dein Code würde auch erst ab der Version 3.5 laufen. In der 3.0er kann der Lambda-Ausdruck so nicht kompiliert werden.

        @Ralf Jansen
        die zusätzlichen Bibliotheken die 3.0 oder 3.5 mitgeliefert hat benutzt solltest du selber wissen
        Natürlich weiss ich das in der Quellcodeumgebung. Wenn ich aber an einem Clientrechner bin, auf welchem ein Kompilat läuft weiss ich das in diesem Moment nicht immer aus dem Kopf. Aus diesem Grund würde ich mir das ganz ger anezigen lassen.

        Comment


        • #5
          Dann kannst du dir nur dir CLR anzeigen lassen und alle zusätzlich geladenen Assemblies mit ihren Versionen. Das einzig eindeutige ist die CLR Version denn Rest kannst du geladen haben oder nicht mit fast jeder beliebigen Versionsnummer. Du könntest also die CLR 2.0 (SP2) benutzen aber System.Core aus 3.5 geladen haben und weil du z.B. noch alten Workflow Foundation Code hast die WF Sachen aus 3.0. Im Prinzip benutzt du dann also Assemblies aus 2.0,3.0 und 3.5. aber nur die CLR Version 2.0 ist eindeutig.

          Comment


          • #6
            Hallo,

            In der 3.0er kann der Lambda-Ausdruck so nicht kompiliert werden.
            Aber die Lin-Query in eine foreach-Schleife mit if-Bedingung umschreiben sollte nicht das Problem sein :-)

            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              Aber die Lin-Query in eine foreach-Schleife mit if-Bedingung umschreiben sollte nicht das Problem sein
              Das ist es auch nicht...
              Code:
               Public Function GetCurrentFrameworkVersion() As Version
                  Dim RA() As System.Reflection.AssemblyName = Assembly.GetExecutingAssembly().GetReferencedAssemblies()
                  For Each AN As System.Reflection.AssemblyName In RA
                    If AN.Name = "System.Core" Then
                      Return AN.Version
                      Exit Function
                    End If
                  Next
                  Return Nothing
                End Function
              Aber bei dem 3er Framework ist standardmäßig kein System.Core vorhanden.
              Framework.jpg
              Es scheint auch kein Verweis mit dem Hinweis auf das 3er Framework vohanden zu sein...

              Und nun?
              Zuletzt editiert von M Merlin; 30.10.2013, 12:22.

              Comment


              • #8
                Hallo,

                mir gings ja nur um die Idee über referenzierte Assemblies auf das verwendete Framework - und explizit: Framework-Version ist nicht unbedingt CLR-Version - zu schließen.
                Falls die Annahme dass System.Core vorhanden ist nicht hält, so gibt es 2 Möglichkeiten: Entweder es wurde einfach nicht referenziert od. die .net-Version ist < .net 3.5.
                Um zu unterscheiden ob .net 2.0 od. .net 3.0 verwendest du eben eine andere Assembly die nur in .net 3.0 verwendet wird. Falls es keine gibt, gäbe es auch keine Grund als Zielframework .net 3.0 zu verwenden.

                Wenns aber ohnehin dein Projekt ist, so wäre es wohl am einfachsten wenn du z.B. in der app.config die Version hinterlegst und von dort ausliest.

                mfG Gü
                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                Comment

                Working...
                X