2012-04-16 71 views
5

Tengo un archivo EXE que hace referencia a un archivo DLL - para este ejemplo lo llamaré TestDLL.dll.
El EXE está escrito en C# y el archivo DLL está escrito en VB .Net.Ensamblado de enlace y redirección

Creé una versión de ensamblaje de demostración de la DLL, por ejemplo, TestDLL.dll versión 1.0.0.0.
Quiero compilar el EXE con una referencia a la versión de demostración DLL (1.0.0.0). Después: quiero que el EXE use la misma DLL, pero la que pondré en el GAC, de cualquier versión.
Con el fin de hacer eso, me puse la "Copia Local" característica de referencia de la DLL para FALSO.

Mi objetivo es, por ejemplo, que después de la compilación, coloque el TestDLL.dll de GAC con la versión de ensamblaje 2.1.6.0, y el EXE lo encontrará utilizando el ensamblado de redirección de ensamblaje. Para eso, utilicé un archivo de configuración. He utilizado este enlace para crearla:
http://msdn.microsoft.com/en-us/library/7wd6ex19(v=vs.71).aspx

Así que mi archivo de configuración se ve más o menos así:

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="myAssembly" 
          publicKeyToken="32ab4ba45e0a69a1" 
          culture="en-us" /> 
     <!-- Assembly versions can be redirected in application, publisher policy, or machine configuration files. --> 
     <bindingRedirect oldVersion="1.0.0.0" 
          newVersion="2.1.6.0"/> 
     </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

El problema es que después de hacer todo esto, corro el EXE y cuando se accede a la DLL, Obtengo el famoso error: System.IO.FileNotFoundException: No se pudo cargar el archivo o ensamblado 'TestDLL, Versión = 1.0.0.0, Cultura = neutro, PublicKeyToken = 9d8162944bd6fdc7' o una de sus dependencias. El sistema no puede encontrar el archivo especificado. Nombre del archivo: 'testdll, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 9d8162944bd6fdc7'

Significado, el EXE no puede encontrar el archivo DLL original de hice referencia a. Sé que puedo simplemente "hacer referencia" al GAC o usar el reflejo, pero no quiero, ya que se supone que este EXE solo funciona de esta manera.

¿Alguien sabe cuál es el problema y cómo solucionarlo?
Gracias

+0

¿Ha establecido la propiedad "Versión específica" de la referencia en falso? –

+0

¿Podría publicar el archivo .config? – Xharze

+0

Claro, también configuré la propiedad "Versión específica" de la referencia como falsa. –

Respuesta

11

Asegúrese de haber configurado correctamente publicKeyToken. En el código que ha mostrado, está utilizando publicKeyToken="32ab4ba45e0a69a1", que es el token de clave pública del enlace de MSDN. Esto obviamente es no el token de clave pública de su ensamblaje. Para que esto funcione, debe tener ambos ensambles (1.0.0.0 y 2.1.6.0) firmados con la misma clave. Para extraer el símbolo de clave pública se puede utilizar la herramienta de sn.exe o mirado el seguimiento de la pila excepción de que está recibiendo (que le está diciendo que publicKeyToken="9d8162944bd6fdc7"):

sn.exe -Tp myassembly.dll 

Pero si la asamblea que el ejecutable que fue compilada no era firmado con la misma clave esto no funcionará.

También veo que ha configurado el culture="en-us", pero ¿usa su ensamblaje esta cultura? También puedes probar culture="Neutral".

Finalmente, asegúrese de haber desplegado la versión correcta del conjunto en el GAC.

+1

Eso lo hará. La cultura tampoco es correcta. –

Cuestiones relacionadas