2011-08-01 2 views
0

J'ai une question concernant les versions 2 CLR, c'est-à-dire la version 2 et la version 4 du framework .NET, qui utilisent différents emplacements GAC. J'ai une application cliente construite qui fait référence à un assembly "X" du v2 GAC (C: \ Windows \ Assembly). Je suis en train de mettre à jour l'assembly "X" pour l'exécuter sur la version 4 du framework .NET (C: \ Windows \ Microsoft.NET \ assembly), mais je ne veux pas recompiler l'application cliente. Notez que l'assembly "X" est supprimé du GAC v2 avant d'installer le GAC to v4.Redirection des versions d'assembly vers un autre CLR/GAC

Est-il possible de créer un fichier de stratégie d'éditeur qui redirige un assembly qui résidait dans la version 2 du CLR vers la version 4 du CLR? Si oui, comment cela est-il réalisé?

J'ai recherché le MSDN, et comprenez qu'il existe un champ applyTo sur l'élément assemblyBinding dans lequel vous pouvez spécifier la version du framework .NET, mais cela semble englober la totalité de bind.

Ce que je voudrais est quelque chose comme:

<bindingRedirect oldVersion="1.0.0.0" .Net 2 newVersion="2.0.0.0" .Net 4/> 

J'ai lu ici http://msdn.microsoft.com/en-us/magazine/dd727509.aspx que les applications v2.0 CLR maintenant ne peut pas voir les assemblées CLR v4.0 dans le GAC. Cependant, vous pouvez forcer une application à utiliser le CLR mis à jour à l'aide:

<startup useLegacyV2RuntimeActivationPolicy="true"> 
<supportedRuntime version="v4.0" /> 

Ainsi serait un mélange de ce plus la politique éditeur suffisent, ou est-il un autre moyen?

Répondre

1

Le facteur déterminant ici est la version du CLR dans laquelle votre application client s'exécute. Si c'est v2 alors il n'y a rien que vous puissiez faire pour rendre les assemblages v4 utilisables ou même visibles. S'il s'exécute sous le CLR v4, il tentera automatiquement de résoudre les références d'assembly dans le GAC v4 en premier. La bonne nouvelle, c'est que vous n'avez pas besoin de recompiler votre application client pour y parvenir. Vous pouvez simplement le forcer à exécuter sous .Net 4 en ajoutant ceci au fichier de configuration de l'application:

<configuration> 
    <startup> 
    <supportedRuntime version="v4.0" /> 
    </startup> 
</configuration> 

Cela devrait vous donner ce que vous vouliez.

+0

Merci; Nous avons des clients sur le terrain qui ont été construits en interface avec l'assembly dans le GAC, donc quand nous publions une nouvelle version de l'assembly (en remplaçant, pas en ajoutant), nous ne voulons pas les forcer à recompiler avec la nouvelle version - d'où pourquoi utilisons-nous des assemblys de stratégie d'éditeur pour la redirection? C'est bien que nous puissions éviter la recompilation de l'application client; Cependant, cela signifie que nous devons maintenant nous assurer que le client dispose d'un app.config, et n'oubliez pas de les mettre à jour pour prendre en charge le runtime v4 lorsque nous publions le nouvel assembly tel que décrit. Ce serait bien si la politique de l'éditeur pouvait faire face à cela! – Jeb

+0

Il existe un paramètre de registre par lequel vous pouvez forcer toutes les applications à s'exécuter sous le CLR le plus récent. Voir cette réponse: http://stackoverflow.com/questions/2094694/launch-powershell-under-net-4/2096906#2096906. Je ne sais pas si c'est faisable pour vous, mais cela supprimerait certainement le besoin d'avoir un App.config en place pour chaque client (à condition de pouvoir automatiser les réglages du registre via un GPO ou similaire, bien sûr!). – mthierba

Questions connexes