2009-06-11 5 views
63

Nous avons une application Web qui est déployée sur de nombreux sites Web avec seulement des modifications frontend, la partie backend partagée a sa DLL dans le GAC, nous avons seulement à mettre à jour cette DLL et tous les sites obtiennent la mise à jour.Dll à la fois dans le bac et le gac, lequel est utilisé?

Existe-t-il un moyen de remplacer le GAC avec une DLL dans le dossier/bin pour tester de nouvelles fonctionnalités avant qu'elles ne soient publiées?

Répondre

78

S'il a le même numéro de version que la DLL référencée, le GAC est utilisé.

Si vous incrémentez le numéro de version, reconstruisez le site Web en faisant référence au nouveau numéro de version, placez la nouvelle version dans le répertoire/bin, puis cette DLL sera utilisée.

Si vous ne voulez pas changer le numéro de version, vous n'avez pas vraiment de chance.

Lorsque .NET charge des assemblys nommés forts, il essaie d'abord de déterminer le numéro de version à utiliser. Il le fait d'abord via la référence, puis il recherche publisher policies, puis il recherche binding redirects dans le fichier de configuration. Après cela, il recherche l'assembly dans le GAC, puis dans codebase specified, puis il sonde différents dossiers du système de fichiers pour la DLL. Si, à l'une de ces étapes, il trouve l'assemblage de la bonne version, il s'arrête.

Si vous ne modifiez pas le numéro de version de votre assembly nommé fort, .NET trouvera celui d'origine dans le GAC et arrêtera de chercher. Notez que, parce qu'il s'arrête quand il en trouve un, et parce que regarder dans le GAC est le premier, spécifier une base de code pour votre assembly ne fera rien, sauf si vous spécifiez également un nouveau numéro de version.

+1

Est-ce que je comprends bien? Si la version 1.0.0.0 est dans le GAC mais que je compile avec la version 1.0.0.1 et que je place 1.0.0.1 dans mon BIN, alors GAC est ignoré et BIN est utilisé.Si je supprime le .dll de mon BIN alors 1.0.0.0 dans le GAC sera utilisé même si j'ai compilé avec 1.0.0.1? –

+1

Non. Si vous compilez sur un assembly avec un nom fort, il vous faudra le numéro de version exact, à moins qu'il y ait une politique d'éditeur ou des redirections de liaison disponibles. –

+1

Les stratégies d'éditeur et les redirections de liaison permettent la redirection de la version #, donc si votre programme est compilé avec la version 1.0.0.0 et qu'il existe une politique de redirection de liaison ou d'éditeur spécifiant 1.0.0.1, elle devient la version recherchée. –

2

Je pense que je pourrais dire la même chose penser Adam Sills, mais reformulé pour ma compréhension. Grâce à mes propres tests, ressemble à ceci est ce qui se passe:

  • Si votre application est compilé avec la version 1.0.0.0 et 1.0.0.1 est dans le GAC, vous pouvez omettre le .dll de votre/bin.
  • Si votre application est compilée avec les versions 1.0.0.1 et 1.0.0.0 dans le GAC, vous devez placer le fichier .dll dans votre/bin pour ignorer le GAC. Une erreur se produira si la version GAC est antérieure à la version requise de votre application, sauf si vous incluez la version la plus récente dans votre/bin.

J'espère que cela est correct ...

+1

Le .NET Framework ne * * * effectuera pas automatiquement la redirection des assemblys nommés forts, au moins à partir de .NET 3.5 (.NET 2.0 runtime). Théoriquement .NET 4 pourrait changer les règles, mais j'en doute. –

+1

Merci! Je vois maintenant pourquoi mes tests ont fonctionné avec différentes versions. Je pensais que le nom fort était juste la clé avec laquelle vous l'inscrivez. Mais j'ai en fait deux assemblys enregistrés dans les GAC 1.0.0.0 et 1.0.0.1 avec le même jeton de clé publique. Je pensais que si j'utilisais la même clé, 1.0.0.1 remplacerait 1.0.0.0. Mais cela ne semble pas être le cas.
Merci @Adam pour votre aide! –

0

Vous pouvez afficher les informations de liaison dans le fichier journal à l'aide de l'Assemblée Binding Log Viewer (Fuslogvw.exe), qui est inclus dans le kit de développement logiciel (Windows SDK).

s

11

Je suis en mesure de passer outre le GAC avec l'ensemble dans le dossier \ bin en utilisant l'élément <codebase>. En spécifiant <codebase version="1.2.3.4" href="/bin/MyAssembly.dll" /> dans mon fichier web.config, je peux dire à mon application d'utiliser cette version plutôt que la version spécifiée dans le GAC.

Vous pouvez également jeter un oeil à l'élément <probing> pour spécifier les emplacements d'assemblage?

+5

vous devriez vérifier que vos dll sont signées ou non. Le GAC a priorité sur la base de code et la sonde. Une fois qu'il trouve la version signée dans GAC, il s'arrête. J'ai testé cela avec 4.0 et le doc MSDN est précis, d'abord BindingRedirect, puis GAC, puis CodeBase, puis Probe for StrongName assemblies – CodeCowboyOrg

Questions connexes