2011-10-01 7 views
9

Seguo le istruzioni di una cartella di lavoro di Microsoft .Net del 2006, esaminando uno degli esercizi. (In particolare questo corso è MS2349B e sto facendo il Modulo 4 Esercizio 2). Questi esercizi sembrano costruiti per i precedenti giorni Vista in cui tutti hanno sempre privilegi di amministratore completi. (Sto usando .net 4.0.)Durante la ricerca degli assembly, perché la ricerca di publicKeyToken differisce quando si esegue come admin vs come utente normale?

Questo esercizio prevede la creazione di un assembly di nome sicuro, l'installazione in GAC, la creazione di un eseguibile locale contro il gruppo con nome sicuro, la verifica dell'esecuzione dell'eseguibile.

Come per il tutorial, firmo il mio assembly utilizzando un #if blocco:

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

Costruisco il mio eseguibile come un utente locale:

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 installo nella GAC ​​tramite una visuale prompt dei comandi di Studio eseguito come amministratore:

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

Quando eseguo il mio exe nel prompt dell'amministratore I ottengo l'output che mi aspetto - l'applicazione funziona correttamente e sembra caricare la DLL correttamente dal gac. Quando eseguo sotto il prompt dei comandi non-admin ottengo il seguente errore

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() 

Cosa c'è di strano per me è che la publicKeyToken non è lo stesso di quello che c'è nella GAC:

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

ma se io disinstallare AReverser dal GAC e tentare di eseguire il mio exe come prompt di amministratore ricevo il seguente errore che indica la sua ricerca del f0548c0027634b66 token di chiave pubblica previsto:

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() 

Avviso sotto Amministratore, sta effettivamente cercando il publicKeyToken corretto.

Cosa dà? Perché la ricerca di publickKeyTokens sarebbe diversa? Cosa avrei potuto fare di sbagliato?

EDIT

Il config app c'è stato detto di utilizzare può essere il colpevole, mi chiedo se si deve essere amministratore di applicare alcune di queste impostazioni. Sbarazzarsi di esso sembra causare l'esecuzione come amministratore per fallire (anche se in tal caso publicKeyToken è elencato come NULL). Ecco la mia app config

<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

Hai firmato gli assembly? Non vedo un file chiave nella tua dichiarazione CSC. – user957902

+0

@ user957902 Li firmo con il blocco '#if STRONG' qui sopra come gli esempi nella cartella di lavoro MS2349B mi dicono di –

+1

Da dove viene il file .snk? Se lo hai creato, dovrai modificare il valore del token nel file di configurazione. –

risposta

1

Cerca il tuo disco per AReverser.dll. È possibile che tu abbia alcune copie aggiuntive da qualche parte nascoste. VS può creare copie shadow di dll compilate.

Se ciò non consente di attivare la registrazione di fusione (utilizzare fuslogvw.exe o i registri di fusione spool su disco) e quindi cercare nei registri da cui viene caricata la DLL problematica. IMO è la DLL errata che è stata caricata.

0

Dove si trova la soluzione? Visual Studio non usa il gac per costruire quindi se hai una versione diversa dell'assemblaggio assemblato lasciato nella tua directory di riferimento, il client sarà costruito contro quello e fallirà quando tenterai di caricare in runtime perché il gac viene caricato prima .

Problemi correlati