45 votes

La nouvelle DLL Hell ; la mauvaise version de l'assemblage est liée.

J'utilise VS2013 update 1 avec Nuget v 2.8.50313.46.

Vous pouvez passer à c'est la partie importante et quelques mises à jour récentes, et revenez-y pour vous y référer.

J'ai une solution VS, ceci en est une représentation simplifiée.

-- Solution
    - Base (Class Library)
        Packages:
            No Packages Installed.
        References:
            System
            System.Configuration
            System.Core
            System.Runtime.Caching
            System.Web

    - AppBase (Class Library)
        Packages:
            No Packages Installed.
        References:
            System
            System.Core
            System.Web.Http
            Base

    - Client (Console Application)
        Packages:
            EntityFramework                v6.1.0
            HtmlAgilityPack                v1.4.6
        References:
            EntityFramework
            EntityFramework.SqlServer
            HtmlAgilityPack
            System
            System.Core
            AppBase
            Base

    - Server (Web Application)
        Packages:
            HtmlAgilityPack                v1.4.6
            Microsoft.AspNet.WebApi        v5.1.2
            Microsoft.AspNet.WebApi.Client v5.1.2
                (dependent on > Newtonsoft.Json v4.5.0)
            Microsoft.AspNet.WebApi.Web... v5.1.2
            Newtonsoft.Json                v6.0.3
        References:
            HtmlAgilityPack
            Newtonsoft.Json
            System
            System.Net.Http
            System.Net.Http.Formatting
            System.Web
            System.Web.Http
            System.Web.HttpHost
            AppBase
            Base

Le code à l'intérieur du Server besoins Newtonsoft.Json v6.0.3 pour fonctionner.

Lorsque je reconstruis tout et que j'exécute, tout fonctionne bien, comme prévu.

Je construis ensuite juste AppBase sans bâtiment Server . AppBase ne dépend que de Base . Les binaires pour AppBase y Base sont "à jour", comme prévu.

Cependant,

c'est la partie importante ,

la construction de AppBase provoque le Newtonsoft.Json.dll dans la section "Serveur \bin "pour remplacer la version antérieure 4.5.

Lorsque je fais une demande à la Server un message d'erreur "500 Intrernal Server Error" est renvoyé en raison de l'erreur de liaison causée par l'adresse incorrecte. Newtonsoft.Json version dll.

Pourquoi la construction d'un assemblage affecte-t-elle un assemblage non dépendant ?

Quelqu'un d'autre a-t-il connu ce problème ?

Quelle est la meilleure façon de résoudre ce problème ?


EDIT 19/06/2014

J'ai créé un nouveau fichier de solution, j'ai d'abord pensé que cela avait résolu le problème. Cependant, le problème a été transféré au fichier System.Net.Http.Formatting.dll :-S

Si j'édite AppBase donc il ne fait pas référence System.Web.Http l'effet disparaît. Peut-être que cela a quelque chose à voir avec le truc MVC dans Program Files ? ...


EDIT 20/06/2014

J'ai posté un réponse de la communauté wiki qui détaille comment j'ai contourné le problème. J'ai pensé que quelqu'un pourrait trouver cela utile. Cependant, la solution de contournement n'explique pas quel est le mécanisme qui affecte Server quand je construis seulement AppBase y Base . Est-ce que cela ressemble à un bug, cela semble faux ?

3voto

Jodrell Points 14205

La référence à System.Web.Http en AppBase indiquait

C:\Program Fichiers(x86) \Microsoft ASP.NET \ASP.NET MVC 4 \Assemblies\System.Web.Http.dll

J'ai ajouté ma dernière

Microsoft.AspNet.WepApi.Core   5.1.2

pour AppBase dans le cadre de Server . Cela a entraîné les paquets de dépendance,

Microsoft.AspNet.WebApi.Client 5.1.2
Newtonsoft.Json                6.0.3 (the only version in my package source)

El System.Web.Http référence dans AppBase indique maintenant,

Dossier MySolution \packages\Microsoft.AspNet.WebApi.Core.5.1.2\lib\net45\System.Web.Http.dll

Quand je construis AppBase maintenant, les DLLs de WepApi en Server ne sont plus altérés par les anciennes versions.


Incidemment,

Ce changement de paquet ajoute plusieurs (a|A)pp.config dans les projets de la solution, tous avec des redirections obligatoires vers la dernière version de Newtonsoft.Json .


Note

En fait, je considère cela comme une solution de rechange, mais je suis heureux de la trouver.

Le code dans AppBase n'a pas réellement besoin de la dernière System.Web.Http.dll . Je ne sais toujours pas pourquoi le bâtiment AppBase devrait avoir pour effet Server Est-ce un bug ?

Marquer les DLLs problématiques comme étant en lecture seule ne les a pas protégées. Le changement des droits de sécurité l'a fait, mais aucune erreur n'a été enregistrée pendant la construction de AppBase même avec le diagnostic de la construction.

1voto

Artem Points 3

Nuget installe le paquet sélectionné et tout autre paquet dont il dépend. De toute évidence, dans votre solution Server, certains paquets utilisent Newtonsoft.Json v4.5. Nuget copie donc la dll dans la corbeille, et c'est là que le problème se produit.

Vous pouvez utiliser redirection de liaison comme l'a fait remarquer Jon Skeet, ou vous devriez continuer à utiliser Newtonsoft.Json v4.5 dans la solution serveur.

Une autre option consiste à utiliser alias externe pour référencer deux versions différentes de cette dll.

0voto

Sir Juice Points 223

Je soupçonne que le problème que vous rencontrez est lié au cache des paquets de votre solution.

Essayez la procédure, telle que décrite dans la réponse de Jordan Walter, en ce poste

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