72 votes

Comment puis-je forcer .NET à utiliser une copie locale d'un assemblage situé dans le GAC

J'ai un .NET de l'assemblée qui (pour des raisons hors de mon contrôle) doit être dans le GAC. Cependant, la même assemblée est utilisé par un autre programme, qui a sa propre copie de l'ancienne version de la même assemblée. Il doit utiliser sa propre copie et non pas ce qui est dans le GAC. La version appropriée est probablement plus de tracas que ce qu'il vaut dans ce cas, pour des raisons que je ne vais pas entrer dans. Ma questions est: est-il de toute façon de le dire .NET: il suffit d'utiliser CETTE DLL, ici, dans ce répertoire - ignorer ce que vous trouverez dans le GAC a, ou n'importe où ailleurs.

49voto

Corbin March Points 18522

Assurez-vous que le GAC Assemblée et l'Assemblée locale ont différents numéros de version (pas une mauvaise idée de laisser votre numéro de build, au moins, l'auto-incrémentation par wild-brevets votre AssemblyVersion dans AssemblyInfo: [assembly: AssemblyVersion("1.0.0.*")] ). Ensuite, rediriger votre assemblée liaison à l'aide de votre application de config:

Dans votre cas, vous n'aurez pas besoin de la "appliesTo" attribut de l'assemblyBinding config. Vous avez juste besoin de quelque chose comme:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="YourAssembly" publicKeyToken="AAAAAAAAAAAA" culture="neutral"/>
            <bindingRedirect oldVersion="0.0.0.0-5.2.1.0" newVersion="5.0.8.1"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>

31voto

JaredPar Points 333733

S'ils ont le même numéro de version, la réponse est que vous ne pouvez pas. Si vous essayez de charger un assemblage qui porte le même nom complet (nom, version, clé) qu'un assemblage GAC, le CLR choisira l'assembly GAC à chaque fois.

11voto

Ying Points 542

Vous pouvez configurer DEVPATH pour forcer le chargement d’un assemblage, voir le texte du lien.

Cela ne répond pas à votre question car il était uniquement destiné à une utilisation en développement et même alors, il n’était pas vraiment recommandé car il ne reflétait pas l’utilisation en production. Cependant, je pensais que je le partagerais quand même car c'est bon à savoir.

2voto

Robert Wagner Points 7904

Avez-vous essayé Assembly.LoadFromFile ()? Ceci est une opération manuelle, mais vous devez charger votre assemblage en mémoire avant de l’utiliser. .NET utilisera alors celui en mémoire au lieu de le rechercher.

Une autre solution serait que si l'assemblée locale n'était pas signée, vous pourriez la différencier de cette façon.

Rob

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X