c# - redirects - La redirección de enlace de ensamblaje no funciona
autogeneratebindingredirects true</ autogeneratebindingredirects (10)
Estoy tratando de configurar una redirección de enlace de ensamblaje, usando la siguiente app.config:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.AnalysisServices"
PublicKeyToken="89845dcd8080cc91" />
<bindingRedirect oldVersion="10.0.0.0"
newVersion="9.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Estoy ejecutando el programa en una máquina con la versión 9.0.242.0 en la GAC, con el token de clave pública especificado. Sin embargo, el CLR no parece estar intentando redirigir el enlace para usar esa versión.
Esto es lo que obtengo en fuslogvw.exe:
LOG: This bind starts in default load context. LOG: Using application configuration file: /Debug/AssemblyRedirectPOC.exe.Config LOG: Using machine configuration file from C:/Windows/Microsoft.NET/Framework/v2.0.50727/config/machine.config. LOG: Post-policy reference: Microsoft.AnalysisServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 LOG: GAC Lookup was unsuccessful. LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices.DLL. LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices/Microsoft.AnalysisServices.DLL. LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices.EXE. LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices/Microsoft.AnalysisServices.EXE. LOG: All probing URLs attempted and failed.
Cuando intenté colocar la dll de la versión 9.0.242.0 en la ruta de la sonda, obtengo esto en su lugar:
LOG: Assembly download was successful. Attempting setup of file: /Debug/Microsoft.AnalysisServices.dll LOG: Entering run-from-source setup phase. LOG: Assembly Name is: Microsoft.AnalysisServices, Version=9.0.242.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 WRN: Comparing the assembly name resulted in the mismatch: Major Version ERR: The assembly reference did not match the assembly definition found. ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
Tenga en cuenta que también intenté cambiar la redirección para usar "9.0.242.0" en lugar de "9.0.0.0" en la aplicación .config y eso no funcionó, aunque no creo que deba hacer ninguna diferencia.
Por lo que entiendo, el objetivo principal de redirigir un enlace es utilizar una versión que no coincida con la que se creó el programa. ¿Estoy completamente perdiendo algo aquí? ¿Es lo que estoy tratando de hacer posible, y si es así, alguna idea de por qué no funciona?
Saludos, Adam
Asegúrese de que su etiqueta <configuration>
no tenga ningún atributo de espacio de nombres . De lo contrario, cualquier etiqueta <assemblyBinding>
será ignorada.
Incorrecto:
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
Derecha:
<configuration>
(de https://.com/a/12011221/150370 )
Compruebe si el error El redireccionamiento explícito de enlaces en xxx, Culture = neutral, PublicKeyToken = xxx "está en conflicto con un redireccionamiento de enlaces autogenerado
aparece en la ventana de salida (no aparecerá en la ventana de error)
Cualquier error tipográfico en la configuración xml puede ser una causa. El cargador simplemente no puede ver su configuración. También tuve una hora de dolor de cabeza hasta que me di cuenta de que el error estaba en el carácter "=" en lugar de "-" en el nombre del esquema:
<assemblyBinding xmlns="urn:schemas=microsoft-com:asm.v1">
Simplemente revise cuidadosamente todos los nombres de atributos y valores. Supongo que "PublicKeyToken" debería ser "publicKeyToken"
Esto debería funcionar:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.AnalysisServices" publicKeyToken="89845dcd8080cc91" />
<bindingRedirect oldVersion="10.0.0.0" newVersion="9.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
En mi caso, tuve que quitar el
appliesTo="v2.0.05727"
desde
<assemblyBinding appliesTo="v2.0.05727" xmlns="urn:schemas-microsoft-com:asm.v1">
Encontré que la redirección de enlace funciona porque falta un espacio de nombres en el elemento assemblyBinding.
Correcto
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="TIBCO.Rendezvous" publicKeyToken="1a696d1f90f6158a"/>
<bindingRedirect oldVersion="1.0.0.0-1.0.3191.28836" newVersion="1.0.3191.28836"/>
</dependentAssembly>
Incorrecto
Nota que falta: xmlns = "urn: schemas-microsoft-com: asm.v1"
<assemblyBinding>
<dependentAssembly>
<assemblyIdentity name="TIBCO.Rendezvous" publicKeyToken="1a696d1f90f6158a"/>
<bindingRedirect oldVersion="1.0.0.0-1.0.3191.28836" newVersion="1.0.3191.28836"/>
</dependentAssembly>
He tenido un problema similar en el que mover las redirecciones de enlace a Machine.Config fue lo único que funcionó. Esa no era la solución ideal en mi aplicación winform porque distribuyo mi aplicación a los clientes.
Solución:
Asegúrese de que el archivo .config esté en el directorio desde donde se ejecuta su aplicación. por ejemplo, si su nombre de aplicación es "MyApp", las redirecciones deben estar en el archivo "MyApp.exe.Config" en el directorio de la aplicación.
Tenía que hacer esto, incluso si el código que utiliza archivos DLL de terceros está en una DLL diferente en mi solución y agregar .dll.config no ayudó.
Las políticas de contraseñas excéntricas también pueden hacer que se ignoren los elementos de AssemblyBinding en la configuración. Los caracteres como ''&'' y ''^'' aparentemente no están permitidos en un archivo de configuración. Las herramientas XML en Notepad ++ me lo revelaron después de algunas horas de jugar con el visor de registros de enlace de ensamblaje.
Mi problema se resolvió cuando moví la configuración de redirección de enlace al archivo machine.config.
Muchas gracias por las respuestas, especialmente la de Shrike. Tenía una aplicación que funcionaba en desarrollo, pero no en la versión implementada. Cuando miré más de cerca, tuve esto en producción, que NO coincidía con el desarrollo:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly xmlns="">
<assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
dependAssembly xmlns = "" fue el culpable. Tan pronto como comparé la mía con su respuesta y la arreglé, funcionó. Gracias por la ayuda
Si es de alguna ayuda para alguien, me encontré con esto porque no puse la versión completa para newVersion. es decir, tuve newVersion="3.0.1"
lugar de newVersion="3.0.1.0"