169 votes

Version d’assembly référencé mal cueillette .net

Je viens de copier un projet existant à une nouvelle machine pour commencer à développer sur elle et ont eu un problème avec la version de l'un de mes assemblys référencés (un telerik DLL comme il arrive).

Le projet à l'origine référencé une ancienne version de l'assembly (permet de l'appeler v1.0.0.0). Ma nouvelle machine dispose de la dernière version de l'assemblée installé, j'ai donc pensé à jour (appelons la nouvelle version v2.0.0.0).

Maintenant, voici le problème: Si je copie le vieux v1.0.0.0 dll dans le dossier du projet et l'ajouter comme une référence, le site web se lance sans problème. Si je supprime la référence (et aussi de supprimer l'ancienne DLL à partir de mon système) et ajouter la nouvelle version (v2.0.0.0), la page indique l'exception suivante:

Impossible de charger le fichier ou l'assembly "XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4 " ou l'une de ses dépendances. La situé assemblée manifeste définition n' correspond pas à la référence d'assembly. (Exception de HRESULT: 0x80131040)

Clairement, le code est à la recherche pour la sortir de la date de la version et ne peut pas le trouver. Mais pourquoi?

Je greped le dossier de la solution pour que le numéro de version et ne pouvait pas trouver une seule référence. J'ai vérifié le texte de la .csproj dossier et constaté la version montre bien la version la plus récente et la HintPath affiche correctement le chemin d'accès à la nouvelle DLL. En outre, parce que je n'ai pas installer la DLL ancienne sur le système il n'est pas dans mon GAC (si v2.0.0.0 n'a, comme prévu).

J'ai ensuite permis la fusion de la visionneuse de journaux pour essayer de comprendre pourquoi il est à la recherche pour cette ancienne version, mais pas de chance:

Assembly Load Trace: The following information can be helpful to determine why the assembly 'XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4' could not be loaded.


=== Pre-bind state information ===
LOG: User = MyComp\me
LOG: DisplayName = XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
 (Fully-specified)
LOG: Appbase = file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/
LOG: Initial PrivatePath = d:\My Documents\Visual Studio 2010\Projects\CoolProj\WebApp\bin
Calling assembly : WebApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: d:\My Documents\Visual Studio 2010\Projects\CoolProj\WebApp\web.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX.DLL.
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX/XXXXXX.DLL.
LOG: Attempting download of new URL file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/bin/XXXXXX.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

Tout ce qu'elle dit il, qu'il commence par la recherche pour cette ancienne assemblée. J'ai essayé de trouver une solution en ligne et vu ce similaire DONC, la question, mais il semble être l'exact opposé de mon problème. Que l'interlocuteur du programme a été de trouver le mauvais DLL au lieu de le référencés. Alors que mon problème est que le programme est mystérieusement à la recherche de mauvais DLL et impossible de le trouver quand le droit peut être trouvé localement dans le dossier bin et dans le GAC.

Pourquoi la mienne est à la recherche pour l'ancienne version? Où puis-je chercher pour trouver cette mauvaise référence?

178voto

Chris Conway Points 6678

Ma conjecture est qu’un autre assembly, que vous utilisez fait référence à la dll vieux. Êtes-vous familier avec toutes les autres références de projet utilisées et l’un d'entre eux ont une référence aux dll de Telerik ?

Pouvez vous mettre dans une redirection de liaison dans votre fichier web.config comme ça ?

38voto

Ray L Points 2168

J’ai essayé la plupart des réponses, mais encore ne pouvait pas travailler. Cela a fonctionné pour moi :

faites un clic droit sur la référence -> propriétés -> changer « Version spécifique » false.

enter image description here

J’espère que cela aide.

28voto

Chris Lively Points 59564

Je suis avec Chris Conway sur celui-ci (upvoted lui). Le problème, c'est que vous faites référence à l'un des telerik assemblées dans votre projet qui fait référence à un autre un seul qui n'est pas là.

Première chose: je ne suis pas installer n'IMPORTE quel fournisseur (c'est à dire: telerik) assembly dans le GAC. Telerik des choses est compilé vers le bas, juste deux assemblées, de toute façon (telerik.web.de conception et de telerik.web.l'interface utilisateur). Il vous suffit de déployer ceux avec l'application.

Deuxièmement, dans chacune de vos .proj fichiers (comme .csproj) il va y avoir un <reference include..> , ce qui souligne l'Telerik.Web.Fichier d'INTERFACE utilisateur. Ce principe contient un numéro de version. Assurez-vous que l'assemblée de vous mettre dans le dossier bin correspond à cette version.

Troisièmement, assurez-vous que TOUS vos projets d'utilisation de la dernière assemblée. Aussi assurez-vous qu'ils s'emparent de l'assemblée à partir d'un chemin d'accès local au lieu de le GAC. (Je n'aime vraiment pas le GAC. Il a causé pas la fin des problèmes sur certains de ces projets, j'ai eu). Généralement, nous avons un "Assemblées" le dossier que tous les projets d'utilisation externe des références d'assembly.

Quatrièmement, visual studio recherche automatiquement votre gac a chaque fois qu'un projet de site web est chargé et retargets l'assemblée endroits, si il trouve quelque chose dans le gac. Je ne me souviens pas si elle l'a jamais fait cela pour des projets d'application web, mais je n'ai pas eu le problème dans un temps long avec ceux-ci. Cela peut causer des problèmes lors du déploiement.

Cinquièmement, vous pouvez assigner les numéros de version pour les assemblages dans le web.config. Dans l' runtime/assemblybinding section, vous pouvez utiliser quelque chose comme la suivante qui prend chaque telerik assemblée déployée en 2008 de l'avant et de points d'une version particulière:

  <dependentAssembly>
    <assemblyIdentity name="Telerik.Web.UI" publicKeyToken="121fae78165ba3d4" />
    <bindingRedirect oldVersion="2008.0.0.0-2020.0.0.0" newVersion="2010.02.0713.35" />
  </dependentAssembly>

3voto

AspNetDev Points 181

Avez-vous d’autres projets dans cette solution ? (peut être un autre projet était faisant référence à une ancienne version) Habituellement dans VS, dépendance dll s’étend sur tous les projets dans la solution.

2voto

Warrick Hunter Points 556

Mon problème était que les assemblys anciens étaient dans le dossier _bin_deployableAssemblies sous l’Application Web. Cela signifie que les assemblys anciens ont été écrasant les assemblys GAC lorsque vous générez le projet.

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