.net msbuild log4net

.net - ¿Cómo solucionar el error "No hay forma de resolver conflictos entre"?



msbuild log4net (3)

Porque:

Tienes dos ensamblajes diferentes con el mismo nombre de archivo . El compilador no sabe cuál elegir copiar en el directorio de salida, por lo que da esa No way to resolve conflict between... error.

En mi caso, eran ensamblajes completamente diferentes que tenían los mismos nombres de archivo.

En su caso, tiene dos versiones diferentes del mismo conjunto (log4net)

solución:

En mi caso, la solución fue simplemente cambiar el nombre de uno de los archivos dll.

En su caso, la solución es averiguar dónde se hizo referencia al ensamblaje anterior y corregirlo para hacer referencia al más nuevo.

Recientemente se agregó log4net.dll a nuestro objeto de datos. Nuestro objeto de datos se compila perfectamente, pero cuando intenta construir cualquier elemento que haga referencia a nuestro objeto de datos, obtiene el siguiente error:

No hay forma de resolver el conflicto entre "log4net, Version = 1.2.10.0, Culture = neutral, PublicKeyToken = 692fbea5521e1304" y "log4net, Version = 1.2.9.0, Culture = neutral, PublicKeyToken = b32731d11ce58905". Elegir "log4net, Version = 1.2.10.0, Culture = neutral, PublicKeyToken = 692fbea5521e1304" arbitrariamente.

Encontré el siguiente thread que me permitió obtener más información sobre el problema.

log4net se usa para una variedad de cosas en nuestro proyecto. Por ejemplo, Crystal instaló 1.2.9 en el GAC. Sé que infragictics usa 1.2.10.

Tenemos un directorio específico, llámenlo c:/references , donde construimos todos nuestros dlls y que todas nuestras aplicaciones usan para hacer referencia a nuestros dlls internos. Así que establecí específicamente mi referencia en nuestro objeto de datos a c: / references / log4net.dll que es la versión 1.2.11. Lo cual es extraño porque en el mensaje de error de arriba no ves 1.2.11. El dll se referencia con una versión específica: = True y Copy Local: = True. Revisé el directorio de compilación y 1.2.11 de log4net se movió correctamente.

Si ayuda aquí son algunos de los mensajes de error detallados:

There was a conflict between "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" and "log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905". No way to resolve conflict between "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" and "log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905". Choosing "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" arbitrarily. References which depend on "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" [C:/Windows/assembly/GAC_32/log4net/1.2.10.0__692fbea5521e1304/log4net.dll]. C:/Windows/assembly/GAC_MSIL/CrystalDecisions.Shared/13.0.2000.0__692fbea5521e1304/CrystalDecisions.Shared.dll References which depend on "log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905" [C:/Program Files (x86)/Business Objects/Common/4.0/managed/log4net.dll]. c:/references/DBObjectAdoNet.dll Project file item includes which caused reference "c:/references/DBObjectAdoNet.dll".

Actualización : Hasta ahora, la única forma que encontré para corregir el error es hacer referencia a log4net en cualquier cosa que haga referencia a DBObjectAdoNet.dll. Esta no es realmente una solución utilizable para nosotros, ya que casi todo en nuestro sistema lo usa.

2da Actualización : Intenté poner log4net en el GAC pensando que solucionaría el problema, pero aún no lo haría.

Tercera actualización : hice una llamada de soporte a Microsoft. Quieren que use Assembly.LoadFrom (), lo cual es muy, muy dudoso ya que hacemos más de 300,000 llamadas en una aplicación y requeriría reflexión para cada llamada, lo que desaceleraría bastante las cosas.

Descubrí que si desinstalo Crystal Runtime en mi máquina, el error desaparece, lo cual no tiene mucho sentido, porque lo único que hace, hasta donde puedo ver, es eliminar log4net 1.2.10.0 del GAC bajo el Las carpetas .NET Framework 2.0, que no deberían importar porque la aplicación es una aplicación .NET framework 4.


Abra su archivo de proyecto ( .csproj en C # o .vbproj en VB.NET) para editarlo.

Asegúrese de que la referencia de log4net sea Nombre de tipo completamente calificado , tenga HintPath y SpecificVersion=True .

<Reference Include="log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL"> <HintPath>../references/log4net.dll</HintPath> <SpecificVersion>True</SpecificVersion> </Reference>

Guarde el archivo e intente reconstruirlo.


Descubrimos que el tiempo de ejecución de cristal definitivamente era el problema. Si desinstalamos log4net en %windir%/assembly que Crystal runtime instaló, el mensaje de advertencia desaparecerá. Lo que es extraño es que si instalo log4net 1.2.10 desde el sitio de log4net en el GAC, entonces el mensaje de advertencia no vuelve a aparecer. Si alguien puede explicar eso, por favor agregue a este hilo. Crystal firmó log4net con su propia clave de nombre fuerte (el token de clave pública es diferente).

La clave para solucionar el problema de log4net es que log4net es un proyecto de código abierto. Lo que significa que simplemente podemos construir el dll desde la fuente con un nombre diferente. Todavía no lo he probado, pero eso debería solucionar el problema. Tendremos el paso adicional de construir desde la fuente cada vez que queremos actualizar log4net, pero teniendo en cuenta cuánto vamos a actualizar la dll, no es un gran problema.