¿Por qué mi aplicación siempre usa la última versión de GAC en lugar de la versión referenciada?

StackOverflow https://stackoverflow.com//questions/10700669

Pregunta

Contexto

Tengo 2 versiones diferentes de un ensamblado instaladas en GAC, la versión 1.0 y la versión 2.0.Hice una aplicación que hace referencia a 1.0 como una versión específica.

Asunto

Cuando ejecuto mi aplicación, siempre cargará la versión 2.0, mientras que la aplicación hace referencia específicamente a la versión 1.0.

Pregunta

¿Por qué está pasando esto?¿Cómo puedo forzar que mi aplicación cargue la versión para la que fue compilada?

No me parece que esto tenga nada que ver con una redirección vinculante ya que mi aplicación ni siquiera conocía la versión 2.0 cuando la construí y que los metadatos de referencia "Versión específica" están establecidos en verdadero.

Gracias.


Editar:

El ensamblado al que me refiero es en realidad Oracle.DataAccess del paquete ODAC.Noté que otros ensamblados denominados Policy.x.xxx.Oracle.DataAccess se publicaron en GAC.


Edición 2:

Después de examinar la política Oracle.DataAccess, encontré la configuración que define la redirección vinculante:

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
          <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
            <bindingRedirect oldVersion="4.112.0.0-4.112.3.0" newVersion="4.112.3.0"/>
        </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

Aunque agregué la redirección de enlace invertido en la configuración de mi aplicación, la política en GAC parece tener prioridad.encontré un artículo de MSDN tratando el tema y sugiriendo ignorar la política con esta configuración:

<publisherPolicy apply="no" />

Pero todavía no funciona...


Edición 3:

Intenté eliminar la política del GAC y reinicié mi máquina.Finalmente funcionó.No parece un desarrollo de solución cómodo, pero esta política rompió una de mis aplicaciones, lo que significa que deshabilitar la política es lo correcto en mi caso.


Edición final:

Igor me dio la respuesta correcta.Todo lo que tuve que hacer para solucionar esas políticas fue utilizar el publisherPolicy configuración en la sección de configuración derecha:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
      <publisherPolicy apply="no"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>
¿Fue útil?

Solución

Una vez que haya editado su pregunta, quedará claro que este es el archivo de política que afecta el enlace del ensamblado.

En el caso de Oracle, hay un archivo llamado Policy.X.Y.Oracle.DataAccess.config con un contenido similar a este:

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
          <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
            <bindingRedirect oldVersion="10.1.0.000-10.2.0.100" newVersion="10.2.0.100"/>
        </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

La política es instalada por el instalador de Oracle y redirige Oracle.DataAccess.dll a la última versión, ya que Oracle cree que la biblioteca es compatible con versiones anteriores.

EDITAR:Si no desea que se aplique la política del editor para una asamblea particular, ponga el elemento en el elemento:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
        <assemblyIdentity name="myAssembly" publicKeyToken="..."  culture="en-us" />
        <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
            <publisherPolicy apply="no" />
    </dependentAssembly>
</assemblyBinding>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top