2011-10-01 11 views
9

Estoy siguiendo las instrucciones de un libro de trabajo de Microsoft 2006 .NET, pasando por uno de los ejercicios. (Específicamente este curso es MS2349B y estoy haciendo el Ejercicio 4 del Módulo 2). Estos ejercicios parecen construidos para los días anteriores a Vista, cuando todos tienen privilegios de administrador completos todo el tiempo. (Estoy usando .net 4.0.)Al probar ensamblajes, ¿por qué la búsqueda de publicKeyToken difiere cuando se ejecuta como administrador vs como usuario normal?

Este ejercicio implica construir un ensamblado de nombre sólido, instalarlo en el GAC, compilar un ejecutable local contra el ensamblado nombrado fuerte, verificando que se ejecuta el ejecutable.

De acuerdo con el tutorial, que escribo mi ensamblaje usando un bloque #if:

#if STRONG 
[assembly: System.Reflection.AssemblyVersion("2.0.0.0")] 
[assembly: System.Reflection.AssemblyKeyFile("OrgVerKey.snk")] 
#endif 

construyo mi ejecutable como un usuario local:

C:\path\to\lab>csc /define:STRONG /target:library 
/out:AReverser_v2.0.0.0\AReverser.dll AReverser_v2.0.0.0\AReverser.cs 
C:\path\to\lab>csc /reference:MyStringer\Stringer.dll  
/reference:AReverser_v2.0.0.0\AReverser.dll Client.cs 

lo instalo en la GAC ​​a través de una representación visual el símbolo del sistema de estudio se ejecuta como administrador:

C:\path\to\lab>gacutil /i AReverser_v2.0.0.0\AReverser.dll 

Cuando ejecuto mi exe en el indicador de administrador I obtener la salida que espero - la aplicación funciona bien y parece cargar correctamente la dll desde el gac. Cuando corro bajo el símbolo del sistema que no es administrador me sale el siguiente error

Unhandled Exception: System.IO.FileLoadException: Could not load file or assembl 
y 'AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b5fcbdcff229fabb' 
or one of its dependencies. The located assembly's manifest definition does not 
match the assembly reference. (Exception from HRESULT: 0x80131040) 
    at MainApp.Main() 

Lo que es extraño para mí es que el publicKeyToken no es lo mismo que lo que está en la GAC:

AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0027634b66 

pero si desinstalar AReverser de la GAC ​​y el intento de ejecutar mi exe como símbolo del administrador me sale el siguiente error que indica su busca de la f0548c0027634b66 símbolo de clave pública se esperaba:

C:\path\to\lab>gacutil /u "AReverser,Version=2.0.0.0,Culture=neutral, 
PublicKeyToken=f0548c0027634b66" 
Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.1 
Copyright (c) Microsoft Corporation. All rights reserved. 


Assembly: AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0027 
634b66 
Uninstalled: AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0 
027634b66 
Number of assemblies uninstalled = 1 
Number of failures = 0 

C:\path\to\lab>Client.exe 

Unhandled Exception: System.IO.FileLoadException: Could not load file or assembl 
y 'AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0027634b66' 
or one of its dependencies. The located assembly's manifest definition does not 
match the assembly reference. (Exception from HRESULT: 0x80131040) 
    at MainApp.Main() 

Comunicación con arreglo Administrador, realmente busca el publicKeyToken correcto.

¿Qué ofrece? ¿Por qué difieren las búsquedas de publickKeyTokens? ¿Qué podría haber hecho mal?

EDITAR

La aplicación de configuración que nos dicen de su uso puede ser el culpable, me pregunto si tiene que ser administrador para aplicar algunos de estos ajustes. Deshacerse de él parece causar que falle el administrador (aunque en ese caso publicKeyToken aparece como NULL). Aquí está mi aplicación de configuración

<configuration> 
    <runtime> 
     <assemblyBinding 
      xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <probing privatePath="MyStringer"/> 
      <publisherPolicy apply="no"/> 
      <dependentAssembly> 
       <assemblyIdentity name="AReverser" 
        publicKeyToken="f0548c0027634b66" 
        culture=""/> 
       <publisherPolicy apply="no"/> 
       <bindingRedirect oldVersion="2.0.0.0" 
        newVersion="2.0.0.0"/> 
      </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 
+0

¿Firmó las asambleas? No veo un archivo de clave en su declaración de CSC. – user957902

+0

@ user957902 Los firmo con el bloque '#if FUERTE' anterior como los ejemplos en el libro de trabajo MS2349B me dicen –

+1

¿De dónde vino el archivo .snk? Si creaste el tuyo, entonces tendrás que cambiar el valor del token en el archivo de configuración. –

Respuesta

1

Busca en tu disco para AReverser.dll. Es posible que tenga algunas copias adicionales en algún lugar oculto. VS puede hacer instantáneas de dlls compilados.

Si eso no ayuda a activar el registro de fusión (use fuslogvw.exe o los registros de fusión de spool en el disco) y luego busque en los registros de dónde se carga el dll problemático. IMO es el DLL incorrecto que se carga.

0

¿Dónde dice su solución que es el montaje? Visual Studio no usa el comando gac para compilar, por lo que si tiene una versión diferente del conjunto de ensamblaje aigned en su directorio de referencia, el cliente se compilará contra eso y fallará cuando intente cargar en tiempo de ejecución porque el gac se carga primero .

Cuestiones relacionadas