wake-up-neo.net

Was bedeutet es wirklich, ein Framework als Ziel festzulegen und wie kann ich die Kompatibilität maximieren?

Grüße an alle,

Das hat mich verwirrt, seit ich zum ersten Mal in C # programmiert habe. Mein Ziel ist es, eine Assembly zu erstellen, die auf dem neuesten .NET-Framework des Benutzers ausgeführt werden kann. Ich möchte nicht, dass .NET 4 installiert wird, aber ich möchte es verwenden, wenn der Benutzer es hat, und was noch wichtiger ist, ich möchte, dass es weiterhin funktioniert, wenn der Benutzer only .NET 4 und nichts hat unten. Ich beginne zu vermuten, dass dies nicht einmal möglich ist.

Ich verstehe nicht wirklich, was ich auswähle, wenn ich das "Ziel-Framework" in Visual Studio ändere. Bedeutet das "wird mit dieser Version und höher kompatibel sein"? Oder "wird nur mit dieser Version kompatibel sein"? Es scheint so, als ob es das letztere ist. Meine Tests in virtuellen Maschinen haben ergeben, dass .NET 4-Assemblys ohne .NET 4 und .NET 3.5-Assemblys ohne .NET 3.5 fehlschlagen. Kann ich dies nicht einstellen, um maximale Kompatibilität zu erreichen?

UPDATE: Zur Verdeutlichung habe ich ein Programm, das auf .NET 2 abzielt. Die Poster hier scheinen darauf hinzudeuten, dass es mit .NET 4 geladen werden sollte. In einer Umgebung, in der nur .NET 4 und nichts davor vorhanden ist, kann es jedoch nicht geladen werden.

UPDATE2: Okay, habe es herausgefunden, aber es ist weitaus komplexer als die Plakate hier zu denken scheinen. Ich öffne eine andere Frage, um die Feinheiten zu diskutieren, aber die Kurzversion ist, dass Sie eine app.config mit <supportedRuntime version="v4.0" /> benötigen, wenn Sie Nicht-.NET 4-Assemblys unter .NET 4 ausführen möchten. Ohne diese werden sie nicht geladen es.

39
Paul Accisano

Die Frameworks sind so konzipiert, dass sie abwärtskompatibel sind. Wenn Sie ein Programm in .NET 2.0 geschrieben haben, können Sie es in der 4.0-Laufzeit ausführen, da keines der Frameworks jemals die Funktionalität einer früheren Version entfernt hat (weshalb wir immer noch die nicht generischen Auflistungen wie ArrayList haben, obwohl sie sind zugunsten von generischen Sammlungen veraltet). Das Gegenteil ist jedoch nicht unbedingt der Fall; Es wird nicht garantiert, dass eine 4.0-App in 2.0 ausgeführt wird, da sie möglicherweise die neuen Funktionen der neuen Laufzeit nutzt, die in früheren Versionen nicht verfügbar sind. In jedem Fall müssen Sie dies in der app.config mithilfe von SupportedRuntime-Elementen angeben, wenn Ihre App versuchen soll, auf Laufzeitversionen ausgeführt zu werden, auf die sie nicht speziell abzielt.

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

  • Entwickeln Sie Ihre App für die EARLIEST-Framework-Version, die Sie unterstützen möchten. Dadurch wird der Zugriff auf neuere Funktionen neuerer Laufzeiten (wie Linq in 3.5 und Dynamic Typing in 4.0) deaktiviert. Dadurch wird sichergestellt, dass für Ihre App keine Funktion erforderlich ist, die von keiner der unterstützten Laufzeiten bereitgestellt werden kann.

  • 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 systemeigenen Code, der die Laufzeit für die Ausführung Ihrer App initialisiert, mitgeteilt, dass alle anderen akzeptabel sind, wenn die Zielversion nicht gefunden wird. Ich glaube, dass das Verhalten darin besteht, zuerst nach dem Zielframework zu suchen, und wenn es nicht verfügbar ist, sollte es die neueste unterstützte Laufzeit verwenden.

22
KeithS

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

2
Flagbug

Ich glaube das soll die Version sein, die du auswählst und aufwärts. Wenn Sie also ein 2.0-Framework als Ziel festlegen, sollte es funktionieren, wenn auf dem Client 2.0-, 3.0-, 3.5- oder 4.0-Frameworks installiert sind.

Sie wählen auch Sprachfeatures aus, wenn Sie diese Option auswählen. Daher ist mir nicht bekannt, ob Sie 4.0-Framework-Features mit einem Application Targeting 2.0-Framework verwenden können. Selbst das dynamische Laden von Assemblys funktioniert nicht. Versuchen Sie, eine auf 4.0 kompilierte DLL aus einer 2.0-Anwendung zu laden, damit können Sie nicht.

0
BlackICE

So funktioniert das Targeting: Wenn Sie .NET 3.5 als Ziel festlegen, 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 unter .NET 3.5, 4.0 und so weiter.

Es kann jedoch vorkommen, dass Sie auf neue .NET-Funktionen wie LINQ usw. verzichten.

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

Kann ich immer noch .NET Framework 2.0 in VisualStudio 2010 anvisieren?

0
Madhur Ahuja