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>
Hai firmato gli assembly? Non vedo un file chiave nella tua dichiarazione CSC. – user957902
@ user957902 Li firmo con il blocco '#if STRONG' qui sopra come gli esempi nella cartella di lavoro MS2349B mi dicono di –
Da dove viene il file .snk? Se lo hai creato, dovrai modificare il valore del token nel file di configurazione. –