2010-07-01 17 views
63

Estoy usando NHibernate 2.1.2.400 que hace referencia a log4net 1.2.10.0. En el mismo proyecto, también utilizo simplemente el SDK de contabilidad, lamentablemente todavía usa log4net 1.2.9.0.Hace referencia a 2 versiones diferentes de log4net en la misma solución

De modo que puedo hacer que NHibernate funcione si hago referencia a log4net 1.2.10.0 pero el simplySDK no funciona. Y viceversa ...

Supongo que la mayoría de los problemas provienen del hecho de que log4net ha cambiado su clave de ensamblaje. Traté de usar una redirección de enlace sin éxito: las 2 DLL no tienen la misma clave.

Estoy considerando recompilar NHibernate para usar log4net 1.2.9.0 pero parece que es algo incorrecto y mi opinión es que Simply Accounting no actualizará su SDK para usar log4net 1.2.10.0 pronto.

¿Cuál es la mejor manera de manejar esto? ¿Es posible resolverlo en absoluto?

+2

Tengo una pregunta muy similar en http://stackoverflow.com/questions/1744543/reference-two-equal-assemblies-only-public-keys-differ Recurrí a la recopilación. Supongo que este es el advenimiento de dll-hell v2.0. –

+1

mientras revisaba su pregunta, encontré http://stackoverflow.com/questions/2460542/2461746#2461746 que solucionó mi problema. –

+0

¡Genial! Me he estado preguntando sobre hacer que el CLR se vea en diferentes lugares y el atributo 'href' parece ser el truco. Gracias por señalar eso! –

Respuesta

127

he encontrado la solución a través de este answer to a similar question

Se crea 2 carpetas de su proyecto para cada uno versión de log4net. Coloque cada log4net.dll en su carpeta correspondiente agregando un archivo a la solución (no con la adición de referencia). Puede establecer que la copia en la propiedad del directorio de salida se copie siempre para que se copie automáticamente a la carpeta de salida cuando compile.

A continuación, actualiza el archivo app.config añadiendo algo como esto:

<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="log4net" publicKeyToken="681549d62126b7b8" /> 
     <codeBase version="1.2.9.0" href="log4netv1.2.9.0\log4net.dll" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" /> 
     <codeBase version="1.2.10.0" href="log4netv1.2.10.0\log4net.dll" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" /> 
     <codeBase version="1.2.11.0" href="log4net.dll" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

se puede obtener el símbolo de clave pública de un ensamblado utilizando SN -T [assemblyName]

+1

Esto parece funcionar para mí también. Eliminé log4net de mi lista de Referencias para el proyecto donde estaba ocurriendo el conflicto. Además, como log4net.dll no está en mis carpetas bin, mis rutas href se parecían más a ".. \ .. \ .. \ .. \ Lib \ NHibernate-2.0.1.GA \ log4net.dll" - solo una ruta relativa a donde log4net estará en la máquina de cada desarrollador con nuestro sistema de compilación. – apollodude217

+12

No estoy seguro de obtener esto: ¿cómo no se obtienen errores de compilación si no se hace referencia a log4net? – guidupuy

+1

@guidupuy Creo que puede ser solo una dependencia de una referencia. Es por eso que puede compilar sin la referencia y aún funcionar en tiempo de ejecución. – cdpnet

2

Si la redirección de enlace no funciona y el SDK simplemente de contabilidad es de código cerrado, una posible solución es recompilar NHibernate para usar log4net 1.2.9.0.

+2

Eso funcionaría, pero tener que construir una versión especial de nhibernate sería más difícil de apoyar en el futuro ... gracias. –

3

Puede añadir una exclusión al registro. Sólo tiene que añadir estas claves:

HKEY_LOCAL_MACHINE\Software\Microsoft\StrongName\Verification\log4net,681549d62126b7b8 
HKEY_LOCAL_MACHINE\Software\Microsoft\StrongName\Verification\log4net,1b44e1d426115821 
HKEY_LOCAL_MACHINE\Software\Microsoft\StrongName\Verification\log4net,669e0ddf0bb1aa2a 

Esto hará que el tiempo de ejecución de .NET omitir la validación de los conjuntos mencionados. En teoría, este es un problema de seguridad, pero dado que la clave privada está abierta de todos modos, apenas tiene impacto.

+0

Si bajas tu voto, al menos ten las agallas para decir en voz alta por qué. Mi respuesta es una respuesta legítima a la pregunta y realmente resuelve el problema. –

+0

Como dijo, este es un problema de seguridad. Además, esto implica que debe hacer esos cambios en cada estación de trabajo que ejecuta el software. En una red empresarial compleja, ese tipo de cosas se acumulan para hacer un gran desastre. Prefiero evitarlo tanto como sea posible. Las otras soluciones son autónomas y portátiles. –

+0

Como dije, debido a que las claves privadas están disponibles públicamente de todos modos, no hay ningún problema de seguridad real. Especialmente en una red empresarial, sería más fácil configurar un solo Objeto de política de grupo, que configurar esto para cada aplicación de LOB en uso. Puede configurarlo una vez a nivel de dominio y nunca tener que pensarlo de nuevo. –

Cuestiones relacionadas