Question

J'ai un scénario dans lequel j'ai plusieurs versions du même assemblage que je dois stocker dans les dossiers privés de l'application, dans une structure comme celle-ci:

.\My.dll          // latest version, say 1.1.3.0
.\v1.1.1\My.dll   // version 1.1.1.0
.\v1.1.2\My.dll   // version 1.1.2.0

Mon problème, c'est que le moteur d'exécution .Net, lorsqu'on lui demande l'une des versions antérieures, trouve toujours la dernière version, puis échoue en raison d'une incompatibilité des numéros de génération avant d'essayer de rechercher une meilleure correspondance.

Les assemblys portent un nom fort et j'utilise cette configuration dans mon app.config:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="My" 
                publicKeyToken="xxxxxxxx" culture="netural" />

                <bindingRedirect oldVersion="1.0.0.0-1.1.1.0" 
                    newVersion="1.1.1.0" />
                <bindingRedirect oldVersion="1.1.3.0-1.1.65535.65535" 
                    newVersion="1.1.3.0" />

                <codeBase version="1.1.1.0" href="v1.1.1\My.dll" />
                <codeBase version="1.1.2.0" href="v1.1.2\My.dll" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

J'espère que quelque chose m'a manqué ici. Je sais que cela peut être résolu en code en écoutant le AppDomain. AssemblyResolve , mais j'aimerais bien voir une solution de configuration pure.

Mise à jour: J'ai donc trouvé le bogue, qui est, comme Kent l'a supposé, une faute de frappe. culture = "netural" doit être culture = "neutre" . Cela dit, sans typo, la résolution fonctionne très bien lorsque vous utilisez des éléments codeBase qui pointent vers chaque version. L’élément probing ne semble pas fonctionner dans ce scénario.

Était-ce utile?

La solution

Sans voir la solution complète, je ne peux que supposer que vous avez une faute de frappe quelque part. Je viens d’essayer cela moi-même et, avec l’aide de fuslogvw , j'ai pu le faire fonctionner.

J'ai trois versions de l'assembly et l'application consommatrice fait référence à une version plus ancienne que celle-ci dans son répertoire de sortie. Le CLR recherche les redirections et l’entrée CodeBase et charge la version correcte (la plus ancienne).

Je peux vous envoyer ma solution par courrier électronique si vous fournissez une adresse électronique.

Kent

Autres conseils

Pouvez-vous utiliser un probepath? nous l'utilisons pour forcer les contrôleurs non contrôlés (par exemple, les résolveurs tiers - tels que MSTest) à rechercher les assemblys où nous en avons besoin.

<?xml version ="1.0"?>
<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <probing privatePath="v1.1.1;v1.1.2;"/>
        </assemblyBinding>
    </runtime>
</configuration>

Voir ici pour plus d'informations

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top