2008-10-08 5 views
2

J'ai créé une bibliothèque commune au travail et elle est installée dans le GAC sur notre serveur de test. Je l'ai récemment mis à jour et je souhaite que toutes nos applications utilisent la mise à jour. J'ai créé un assembly de stratégie d'éditeur et l'ai installé dans le GAC avec la mise à jour, mais lorsqu'une application Web charge Leggett.Common, 1.0.0.0, elle n'est pas redirigée vers Leggett.Common, 1.1.0.0. J'ai l'assembly commun (il y en a cinq, mais restons simple) sur un lecteur réseau, j'ai créé le fichier XML de la stratégie de l'éditeur à côté, puis ai utilisé al.exe pour créer l'assembly de stratégie d'éditeur dans le même dossier. Après cela, j'ai mis l'assembly mis à jour dans le GAC et ensuite mis l'assembly de stratégie d'éditeur dans le GAC. L'assembly commun est 'Leggett.Common.dll', le fichier de stratégie d'éditeur est '1.1.Leggett.Common.policy' et l'assembly de stratégie d'éditeur est 'policy.1.1.Leggett.Common.dll'.Comment faire pour créer la demande de l'assembly de redirection du fichier de stratégie de l'éditeur

Le XML pour le fichier de stratégie d'éditeur se présente comme suit:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <dependentAssembly> 
       <assemblyIdentity name="Leggett.Common" 
            publicKeyToken="32cd8f1a53a4c744" 
            culture="neutral" /> 
       <bindingRedirect oldVersion="1.0.0.0" 
           newVersion="1.1.0.0"/> 
      </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

Qu'est-ce que je fais mal?

Précision
Je teste cela sur ma machine dev locale car les développeurs n'ont pas accès au serveur de test.

+0

Pouvez-vous nous fournir le XML pour la politique de l'éditeur? – Kev

+0

Ah, oui. Je voulais le faire –

+0

. Si c'est sur votre machine locale pouvez-vous essayer l'enregistreur de fusion, il est en fait disponible pour toutes les versions de .NET, il vous suffit d'installer le SDK .NET pour la version de .NET que vous utilisez – Kev

Répondre

2

Ok ... à un coup de poignard ...

1 - avez-vous essayé d'utiliser le Assembly Binding Log Viewer (Fuslogvw.exe) pour voir ce que la liaison assemblage se passe?

Vous pouvez le trouver dans:

C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ Bin \ FUSLOGVW.exe (avec VS2008 installé).

2 - «J'ai l'assemblage commun (il y en a en réalité cinq, mais restons simples) sur un lecteur réseau», - Les deux assemblages résident-ils sur le lecteur réseau?

Mise à jour: Ok ... si le nouvel assemblage est sur un lecteur réseau, il y en a probablement trust issues. Pouvez-vous déployer les nouveaux assemblys sur un lecteur local sur le serveur, puis les réinstaller sur le GAC?

Update2: Je sais..stupid stuff .... vous avez certainement le publicKeyToken et le numéro de version correct? C'est-à-dire que votre attribut AssemblyVersion pour le nouvel assemblage est définitivement 1.1.0.0 et que le jeton de clé publique est identique (dans le GAC)?

Avez-vous essayé de supprimer l'attribut culture?

Update3: Salut Max .... Pouvez-vous coller le fichier de stratégie d'éditeur exact que vous avez utilisé? En outre ... n'oubliez pas que si vous redirigez d'un assemblage versionné vers la version 1.0 vers une version supérieure, le nom de la stratégie d'éditeur doit être nommé à l'aide de la version major.minor de l'assembly que vous redirigez. Donc, dans votre cas, la politique de l'éditeur doit être nommée 'policy.1.0.Leggett.Common.dll'. Je remarque que vous l'avez appelé 'policy.1.1.Leggett.Common.dll', ce qui peut être la raison pour laquelle cela ne fonctionne pas.

Et enfin, vous devez vous assurer que vous signez la politique de l'éditeur avec la même clé que celui utilisé par les versions 1.0 et 1.1 assemblées.

J'ai construit un couple de DLL et les ont déposés dans le GAC a ensuite utilisé une application console dans VS pour tester et il ne fonctionne :)

Update4: Salut Max, quelque chose que je ne pensais. Lorsque vous avez créé le fichier de stratégie d'éditeur, avez-vous spécifié la plateforme? Essayez de construire avec:

al /link:1.1.Leggett.Common.policy /out:policy.1.0.Leggett.Common.dll/keyfile: /version:1.0.0.0

Laissez la/plate-forme basculer et spécifier explicitement le numéro de version.

Vive
Kev

+0

Nous n'avons pas VS2008 au travail. Je sais que ce n'est pas la nouvelle version parce que j'ai utilisé ceci: Response.Write (typeof (ApplicationSecurityContext) .Assembly.FullName); Non, ils ne sont pas tous les deux sur le lecteur réseau. Juste le dernier est. –

+0

Oui, tout est identique. Je n'ai pas essayé de supprimer l'attribut de culture. Où dois-je l'enlever? Le référence? –

+0

OH. Cela a du sens, mais je n'y ai pas pensé. J'ai utilisé le major.minor du nouveau au lieu de l'ancien pour le nom. Je vais changer cela et voir si je peux le faire fonctionner. –

2

Vous identifier l'ensemble correctement, mais pour quelqu'un d'autre qui lit, référence à l'assemblage par sa racine dans le assemblyIdentity élément sans l'extension du fichier (par exemple, « Fubar » et pas "Fubar.dll").

Microsoft de documentation omet de mentionner que ... # $% #! (! @!

Questions connexes