2010-12-06 63 views
31

Salutations à tous,Qu'est-ce que cela signifie vraiment de cibler un framework et comment maximiser la compatibilité?

Cela m'a confondu depuis que j'ai commencé à coder en C#. Mon but est de créer un assembly qui fonctionnera sur le framework .NET le plus récent dont dispose l'utilisateur, quel qu'il soit. Je ne veux pas exiger .NET 4 pour être installé, mais je veux l'utiliser si l'utilisateur l'a, et plus important encore, je veux que cela fonctionne toujours si l'utilisateur a seulement .NET 4 et rien au-dessous. Je commence à penser que ce n'est même pas possible.

Je ne comprends pas vraiment ce que je choisis lorsque je change le "Target Framework" dans Visual Studio. Est-ce que cela signifie "sera compatible avec cette version et vers le haut"? Ou "sera compatible uniquement avec cette version"? Il semble que ce soit le dernier jusqu'à présent; mes tests dans des machines virtuelles montrent que les assemblys ciblés .NET 4 échouent sans .NET 4, et les assemblys ciblés .NET 3.5 échouent sans .NET 3.5. N'y a-t-il aucun moyen de régler cela afin que je puisse atteindre une compatibilité maximale?

MISE À JOUR: Pour clarifier, j'ai un programme qui cible .NET 2. Les affiches ici semblent indiquer qu'il devrait charger avec .NET 4. Mais dans un environnement avec seulement .NET 4 et rien avant, il échoue charger. UPDATE2: D'accord, j'ai compris, mais c'est beaucoup plus complexe que ce que les affiches semblent penser ici. J'ouvre une question différente pour discuter des subtilités, mais la version courte est, vous avez besoin d'un app.config avec <supportedRuntime version="v4.0" /> si vous voulez exécuter des assemblages non.NET 4 sur .NET 4. Ils ne se chargeront pas sans il.

+1

Puis-je vous demander ce que vous essayez d'écrire que vous voulez utiliser le dernier cadre possible? Dans la plupart des cas, il est acceptable d'écrire une application dans les plus brefs délais, sinon vous allez vous financer avec des frameworks spécifiques et essayer de jouer au mix-and-match en fonction des versions installées. –

+1

Ce n'est pas que je veuille vraiment utiliser le dernier framework possible, c'est que je veux que les utilisateurs qui n'ont que .NET 4 installé n'aient pas à télécharger et installer le framework * gargantuan * .NET 3.5. –

Répondre

17

Les cadres sont conçus pour être rétrocompatible; si vous avez un programme écrit en .NET 2.0, vous pouvez l'exécuter dans le runtime 4.0, car aucun framework ne supprime les fonctionnalités d'une version antérieure (c'est pourquoi nous avons toujours les collections non génériques comme ArrayList, même si ils sont dépréciés au profit des collections génériques). Cependant, l'inverse n'est pas nécessairement vrai; une application 4.0 n'est pas garantie pour s'exécuter dans la version 2.0, car elle PEUT tirer parti des nouvelles fonctionnalités du nouveau moteur d'exécution qui ne sont pas disponibles dans les versions antérieures.Dans tous les cas, si vous souhaitez que votre application tente de s'exécuter sur des versions d'exécution qu'elle ne cible pas spécifiquement, vous devez le spécifier dans le fichier app.config à l'aide des éléments SupportedRuntime.

Pour répondre à votre question, vous pouvez faire ce que vous voulez avec la procédure de base suivante:

  • votre application Développer cibler la version du framework que vous TÔT voulez soutenir. Cela désactivera l'accès aux fonctionnalités les plus récentes des nouveaux runtimes (comme Linq en 3.5, et le typage dynamique en 4.0), garantissant que votre application ne nécessitera aucune fonctionnalité qui ne puisse être fournie par aucune des runtimes supportées.

  • Spécifiez les cadres acceptables pour votre application en utilisant l'élément SupportedRuntime dans votre fichier app.config. Cela indiquera au code natif qui initialise le moteur d'exécution dans lequel votre application s'exécutera que s'il ne peut pas trouver la version ciblée, tous les autres sont acceptables. Je crois que le comportement consiste à rechercher d'abord le framework ciblé, et s'il n'est pas disponible, il devrait utiliser le plus récent runtime supporté.

0

I Je crois que est censé être la version que vous sélectionnez et vers le haut. Donc, si vous ciblez le framework 2.0, cela devrait fonctionner si le client a des frameworks 2.0, 3.0, 3.5 ou 4.0 installés.

Vous sélectionnez également les fonctionnalités de langue lorsque vous choisissez cette option. Par conséquent, je ne connais aucun moyen d'utiliser les fonctionnalités du framework 4.0 à l'aide d'un framework de ciblage d'applications 2.0. Même en chargeant dynamiquement les assemblys ne fonctionne pas, essayez de charger un DLL compilé à 4.0 à partir d'une application 2.0, il ne vous laissera pas.

1

.NET est rétrocompatible, cela signifie que si vous sélectionnez .NET Framework 2.0 comme framework cible, il sera exécuté sur les versions 2.0, 3.0, 3.5 et 4.0. Toutefois, si vous sélectionnez e.g version 4.0 comme infrastructure cible, celle-ci ne sera exécutée que si la version 4.0 est installée.

+8

C'est ce que j'ai supposé, mais cela ne semble pas être le cas. J'ai testé mon application (qui est une DLL d'extension) dans une machine virtuelle avec seulement .NET 4 installé, et elle ne charge pas. 'ngen' me donne l'erreur suivante si j'essaie de l'utiliser:' Impossible de charger le runtime. (Exception de HRESULT: 0x80131700). L'assembly {mon assembly} requiert l'exécution de la version v2.0.50727 de l'environnement d'exécution. » –

+0

See https://stackoverflow.com/a/2455686/1128762 – Graham

0

Voici comment le ciblage fonctionne: Si vous ciblez .NET 3.5, il ne fonctionnera pas si l'utilisateur n'a pas .NET 3.5. Il fonctionnera si l'utilisateur a une version supérieure.

Pour une compatibilité maximale, choisissez .NET 2.0, il fonctionnera même sur .NET 3.5, 4.0 et ainsi de suite.

Cependant, vous risquez de perdre sur les nouvelles fonctionnalités de .NET telles que LINQ etc.

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

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