43 votos

La nueva DLL Hell; versión del ensamblado mal estando limitado

Estoy corriendo VS2013 update 1 con Nuget v 2.8.50313.46

Puede omitir este es poco importante, y algunas de las últimas actualizaciones, y volver por referencia.

Tengo un VS de la solución, esta es una representación simplificada de la misma.

-- 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

El código dentro de la Server necesidades Newtonsoft.Json v6.0.3 a la función.

Cuando me reconstruir todos y ejecutar todo funciona bien, como se esperaba.

Posteriormente construir sólo AppBase, sin la construcción de Server. AppBase es dependiente sólo en Base. Los archivos binarios para AppBase y Base son "up-to-date", como se esperaba.

Sin embargo,

esto es lo importante,

el edificio de AppBase causas de la Newtonsoft.Json.dll en el "Server\bin" de la carpeta, que será sustituido por la anterior versión 4.5.

Cuando hago una petición a la Server, "500 Intrernal Error de Servidor" es devuelto debido a la unión de error causado por la incorrecta Newtonsoft.Json versión de la dll.

¿Por qué la creación de una asamblea efecto no dependiente de la asamblea?

Ha alguien más experimentado esto?

¿Cuál es la mejor manera de resolver este problema?


EDITAR 19/06/2014

He hecho un nuevo archivo de la solución, al principio pensé que esto había resuelto el problema. Sin embargo, el problema había transferido a la System.Net.Http.Formatting.dll :-S

Si puedo editar AppBase por lo que no hace referencia System.Web.Http el efecto desaparece. Tal vez esto es algo para hacer con el MVC cosas en Archivos de Programa? ...


EDITAR 20/06/2014

He publicado una wiki de la comunidad de respuesta en el que se detalla cómo he trabajado todo el problema. Pensé que alguien podría encontrar útil. Sin embargo, la solución no explica el mecanismo que se está efectuando Server cuando construyo sólo AppBase y Base. ¿Suena esto como un error, me parece mal?

2voto

Jodrell Puntos 14205

La referencia a la System.Web.Http en AppBase estaba apuntando a

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

He añadido a mi última

Microsoft.AspNet.WepApi.Core   5.1.2

paquete a AppBase como se utiliza en Server. Esta tirado en los paquetes de dependencia,

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

El System.Web.Http de referencia en AppBase ahora los puntos a,

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

Cuando construyo AppBase ahora, el WepApi Dll en Server ya no alterado a versiones anteriores.


Por cierto,

Este cambio de paquete añade múltiples (a|A)pp.config archivos dentro de la solución de proyectos, todos con enlace redirige a la versión más reciente de Newtonsoft.Json.


Nota

De hecho, me ven esto como un trabajo de todo aunque me alegro de encontrar.

El código en AppBase realmente no necesita el más reciente System.Web.Http.dll. Aún no sé la razón por la construcción AppBase debería efecto Server, es esto un error?

El marcado de los molestos archivos Dll como de sólo lectura no protegerlos. Cambio de la seguridad de los derechos, pero no de error se registra durante la construcción de la AppBase, incluso con diagnóstico de construir el registro.

1voto

Artem Puntos 3

Nuget instala el paquete seleccionado y cualquier otra paquetes de los que depende. Obviamente, en su solución de Servidor hay paquetes con Newtonsoft.Json v4.5, por lo que Nuget copia la dll a la papelera, no se produce el problema.

Usted puede utilizar redirección de enlace como Jon Skeet comentado, o usted debe seguir usando Newtonsoft.Json v4.5 en la solución de Servidor.

Otra opción es el uso de alias externo para hacer referencia a dos diferentes versiones de este archivo dll.

0voto

Sir Juice Puntos 223

Sospecho que el problema se refiere a la caché de paquetes de su solución.

Probar el procedimiento, como se describe en la respuesta de Jordan Walter, en este post

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: