2010-12-06 10 views
31

Grüße alle,Was bedeutet es wirklich, ein Framework auszurichten und wie maximiere ich die Kompatibilität?

Das hat mich verwirrt, seit ich anfing, in C# zu programmieren. Mein Ziel ist es, eine Assembly zu erstellen, die auf dem neuesten .NET-Framework ausgeführt wird, das der Benutzer hat, was auch immer das sein mag. Ich möchte .NET 4 nicht benötigen, um installiert zu werden, aber ich möchte es verwenden, wenn der Benutzer es hat, und noch wichtiger, ich möchte, dass es noch funktioniert, wenn der Benutzer nur .NET 4 und nichts darunter hat. Ich vermute, dass dies nicht einmal möglich ist.

Ich verstehe nicht wirklich, was ich auswähle, wenn ich das "Target Framework" in Visual Studio ändere. Bedeutet das, dass "mit dieser Version kompatibel sein wird"? Oder "wird nur mit dieser Version kompatibel sein"? Es scheint, als ob es das letzte ist; Meine Tests in virtuellen Maschinen zeigen, dass .NET 4-gezielte Assemblies ohne .NET 4 fehlschlagen und dass .NET 3.5-Assembly-Assemblies ohne .NET 3.5 fehlschlagen. Kann ich das nicht einstellen, um maximale Kompatibilität zu erreichen?

UPDATE: Um zu verdeutlichen, habe ich ein Programm, das auf .NET zielt. Die Poster hier scheinen anzuzeigen, dass es mit .NET 4 geladen werden sollte. Aber in einer Umgebung mit nur .NET 4 und nichts davor schlägt es fehl Laden.

UPDATE2: Okay, herausgefunden, aber es ist viel komplexer, als die Poster hier zu denken scheinen. Ich öffne eine andere Frage, um die Feinheiten zu diskutieren, aber die kurze Version ist, benötigen Sie eine app.config mit <supportedRuntime version="v4.0" /> darin, wenn Sie non.NET 4 Assemblys auf .NET 4 ausführen möchten. Sie laden nicht ohne es.

+1

Darf ich fragen, was Sie versuchen zu schreiben, dass Sie das neueste Framework verwenden möchten? In den meisten Fällen ist es akzeptabel, eine Anwendung so früh wie möglich zu schreiben, ansonsten finanzieren Sie sich selbst gegen bestimmte Frameworks und versuchen, das Mix-and-Match-Spiel basierend auf installierten Versionen zu spielen. –

+1

Es ist nicht so, dass ich wirklich das neueste Framework verwenden möchte. Ich möchte, dass Benutzer, die nur .NET 4 installiert haben, das * gigantische * .NET 3.5-Framework nicht herunterladen und installieren müssen. –

Antwort

17

Die Gerüste sind so konzipiert, dass rückwärtskompatibel; Wenn Sie ein Programm haben, das in .NET 2.0 geschrieben wurde, können Sie es in der 4.0-Laufzeitumgebung ausführen, da keines der Frameworks jemals die Funktionalität einer früheren Version entfernt (weshalb wir auch weiterhin die nicht generischen Auflistungen wie ArrayList haben) Sie werden nicht mehr für generische Sammlungen verwendet). Das Gegenteil ist jedoch nicht unbedingt der Fall. Eine 4.0-App wird nicht garantiert in 2.0 ausgeführt, da sie neue Features der neuen Runtime nutzen kann, die in früheren Versionen nicht verfügbar waren.Wenn Sie möchten, dass Ihre App versucht, auf Runtime-Versionen zu laufen, die nicht speziell darauf abzielen, müssen Sie dies in der app.config mithilfe von SupportedRuntime-Elementen angeben.

Ihre Frage zu beantworten, können Sie tun, was Sie mit dem folgenden grundlegenden Verfahren wollen:

  • Entwickeln Sie Ihre App die EARLIEST Framework-Version, die Sie unterstützen möchten Ziel. Dadurch wird der Zugriff auf neuere Funktionen neueren Laufzeiten (wie Linq in 3.5 und dynamische Eingabe in 4.0) deaktiviert, sodass sichergestellt ist, dass für Ihre App keine Funktionen erforderlich sind, die von keiner der unterstützten Laufzeiten bereitgestellt werden können.

  • Geben Sie die Frameworks an, die für Ihre Anwendung akzeptabel sind, indem Sie das SupportedRuntime-Element in Ihrer app.config-Datei verwenden. Dadurch wird dem nativen Code, der die Laufzeit initialisiert, in der Ihre App ausgeführt wird, mitgeteilt, dass die anderen Versionen akzeptabel sind, wenn sie die Zielversion nicht finden. Ich glaube, das Verhalten besteht darin, zuerst nach dem Zielgerüst zu suchen, und wenn es nicht verfügbar ist, sollte es die neueste unterstützte Laufzeit verwenden.

0

I glaube, dies soll sein, welche Version Sie auswählen und aufwärts. Wenn Sie also das 2.0 Framework anvisieren, sollte es funktionieren, wenn der Client 2.0, 3.0, 3.5 oder 4.0 Frameworks installiert hat.

Sie wählen auch Sprachfeatures, wenn Sie dies auswählen, daher weiß ich auf keinen Fall, dass Sie 4.0 Framework-Funktionen mit einem Application Targeting 2.0-Framework verwenden können. Selbst das dynamische Laden von Assemblys funktioniert nicht. Versuchen Sie, eine DLL zu laden, die von einer 2.0-Anwendung zu 4.0 kompiliert wurde.

1

.NET ist abwärtskompatibel, dh wenn Sie .NET Framework 2.0 als Zielframework auswählen, wird es auf der installierten Version 2.0, 3.0, 3.5 und 4.0 ausgeführt. Wenn Sie jedoch die Version 4.0 als Zielframework auswählen, wird sie nur ausgeführt, wenn Sie die Version 4.0 installiert haben.

+8

Dies ist, was ich angenommen habe, aber das scheint nicht der Fall zu sein. Ich habe meine Anwendung (die eine Erweiterungs-DLL ist) in einer virtuellen Maschine getestet, auf der nur .NET 4 installiert ist, und sie wird nicht geladen. 'ngen' gibt mir den folgenden Fehler, wenn ich versuche, es zu verwenden:' Fehler beim Laden der Laufzeitumgebung. (Ausnahme von HRESULT: 0x80131700). Assembly {Meine Assembly} benötigt Version v2.0.50727 der Laufzeitumgebung. ' –

+0

Siehe https://Stackoverflow.com/a/2455686/1128762 – Graham

0

So funktioniert das Targeting: Wenn Sie .NET 3.5 als Ziel verwenden, wird es nicht ausgeführt, wenn der Benutzer .NET 3.5 nicht hat. Es wird ausgeführt, wenn der Benutzer eine höhere Version hat.

Für maximale Kompatibilität wählen Sie .NET 2.0, es läuft sogar auf .NET 3.5, 4.0 und so weiter.

Sie könnten jedoch auch auf neue Features von .NET verlieren heraus wie LINQ usw.

http://msdn.microsoft.com/en-us/library/bb398197(VS.100).aspx

Can I still target .NET Framework 2.0 in VisualStudio 2010?