Comment puis-je la force .NET pour utiliser une copie locale d'un assembly 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.
Vous devez vous connecter pour publier un commentaire.
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:
*
ne pas faire de l'auto-incrément. La documentation MSDN sur AssemblyVersionAttribute indique qu'il doit être aléatoire, mais dans la pratique, Visual Studio utilise le nombre de secondes depuis minuit divisé par 2.Si ils ont le même numéro de version, la réponse est que vous ne pouvez pas. Si vous tentez de charger une assemblée qui a le même assemblage complet (nom, version, clé) en tant que GAC avais assemblée le CLR choisir le GAC avais assemblée de chaque fois.
Vous pouvez définir la DEVPATH à force de charger un assembly, voir texte du lien
Ce n'est pas la réponse à votre question depuis que cela signifiait pour le développement, l'utilisation et même alors vraiment pas recommandé car il n'est pas un miroir de la production à l'utilisation. Cependant, je pense que je vais le partager de toute façon puisque c'est bon à savoir.
Avez-vous essayé de l'Assemblée.LoadFromFile()? C'est un manuel de chose à faire, mais doit se charger de votre assemblée, dans la mémoire avant que cela est nécessaire. .NET sera alors utiliser la mémoire au lieu de la chasse pour elle.
Une autre façon serait si l'assemblée locale n'était pas signé, vous pouvez le différencier de cette façon.
Rob
J'ai eu un problème similaire. J'ai changé le publicKeyToken de la cible dll à l'aide de
ildasm
etilasm
pour générer une nouvelle dll. J'ai ensuite mis à jour dans le projet de référence pour pointer vers la nouvelle dll. Les étapes sont ici.Cela a fonctionné pour moi.
L'une des raisons de la liaison de redirection ne fonctionne pas est parce que l'Oracle.ManagedDataAccess fournisseur a un autre ordre de recherche pour les dll que la non géré fournisseur. Le non géré fournisseur commence dans le répertoire de l'application, puis regarde dans le dllpath dans le registre, puis la dll chemin dans la machine.config, puis dll chemin d'accès au web.config. Selon la documentation d'Oracle, l'ordre de recherche pour le fournisseur géré fonctionne comme ceci:
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/odpnt/installODPmd.html#GUID-0E834EC7-21DF-4913-B712-2B0A07FD58FD
Ainsi, la manière de résoudre ce problème est d'annuler l'inscription du GAC de l'assemblée OU tout simplement une autre version de Oracle.ManagedDataAccess dans votre cellule et le web.config de ce GAC, si vous ne pouvez pas le désinstaller.