Come abilitare la registrazione degli errori di associazione degli assiemi (Fusion) in .NET


818

Come posso abilitare la registrazione degli errori di bind assembly (Fusion) in .NET?


46
Se qualcuno se ne frega, per usare il logger di fusione (fuslogvw.exe) leggi questo articolo: msdn.microsoft.com/en-us/library/e74a18c4(v=VS.100).aspx ti dice dove scaricarlo e altre informazioni.

13
@Will - grazie per averlo condiviso! Come bonus: assicurati di correre fuslogvw.execome amministratore per evitare problemi di diritti.
SliverNinja - MSFT,

13
@Non sono d'accordo sul fatto che l'installazione di fuslogvw sia la risposta "migliore". Se potessi ottenere solo lo strumento senza dover installare l'intero Windows SDK su quello che probabilmente non è un ambiente di sviluppo, avresti un punto.
Coxy,

2
@Will Certo, ma la risposta a cui ti colleghi non copre nulla di tutto ciò.
Coxy,

8
@Will Please non essere così infantile al riguardo. Sei tu quello che cerca di raccogliere rappresentanti promuovendo una risposta che, sebbene utile, la comunità ha giudicato meno utile di altri, uno che è molto più facile e un altro che è praticamente lo stesso.
Coxy,

Risposte:


868

Aggiungi i seguenti valori a

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Fusion
Inserisci:
DWORD ForceLog imposta il valore su 1
DWORD LogFailures imposta il valore su 1
DWORD LogResourceBinds imposta il valore su 1
DWORD EnableLog imposta il valore su 1
String LogPath imposta il valore su cartella per i registri (ad es. C: \ FusionLog \)

Assicurarsi di includere la barra rovesciata dopo il nome della cartella e che la cartella esiste .

È necessario riavviare il programma in esecuzione per forzarlo a leggere le impostazioni del registro.

A proposito, non dimenticare di disattivare la registrazione della fusione quando non è necessario.

inserisci qui la descrizione dell'immagine


23
Le soluzioni di Gary hanno funzionato per me, anche se ho dovuto seguire anche il ripristino di IIS. Nota: l'ho configurato in un ambiente pulito in cui non volevo installare SDK e simili.
Michhes,

5
Alcuni hanno riferito che le modifiche al registro non vengono rimosse immediatamente. Hai provato ad attivare la registrazione Fusion e quindi il riavvio?
Gary Kindel,

54
È necessario riavviare il programma in esecuzione per leggere le impostazioni del registro
Orion Edwards,

50
Fusion Log Viewer fa tutto per te. Andare su Start -> Programmi -> Visual Studio xxxx> Strumenti di Visual Studio> Prompt dei comandi di Visual Studio (esegui come amministratore) e digitare "fuslogvw". In Impostazioni puoi regolare la registrazione.
r3mark

10
Per attivare / disattivare la registrazione a portata di mano, ho creato i file .reg, che si basano sulla risposta di Gary Kindel: abilitazione e disabilitazione .
Igor Kustov,

271

Di solito uso Fusion Log Viewer ( Fuslogvw.exe dal prompt dei comandi di Visual Studio o Fusion Log Viewer dal menu Start) - la mia configurazione standard è:

  • Apri Fusion Log Viewer come amministratore
  • Fai clic su Impostazioni
  • Seleziona la casella di controllo Abilita percorso log personalizzato
  • Immettere la posizione in cui si desidera scrivere i registri, ad esempio c:\FusionLogs( Importante: assicurarsi di aver effettivamente creato questa cartella nel file system.)
  • Accertarsi che sia attivo il livello corretto di registrazione (a volte seleziono Registra tutti i collegamenti su disco solo per accertarmi che le cose funzionino correttamente)
  • Clicca OK
  • Impostare l'opzione di posizione del registro su Personalizzata

Ricordati di disattivare la disconnessione una volta terminato!

(Ho appena pubblicato questo su una domanda simile - penso che sia pertinente anche qui.)


4
Si noti che nei casi in cui si esegue l'hosting del runtime da un'applicazione nativa, per qualche motivo verrà richiesto di utilizzare un percorso di registro personalizzato, altrimenti non verrà registrato nulla.
jpierson,

Almeno nella mia situazione, in realtà non ho dovuto impostare i percorsi di log personalizzati. Tutto quello che dovevo fare era attivare la registrazione, ad esempio "Registra tutti i binding su disco" nella finestra di dialogo delle impostazioni.
Josh,

42
Esegui come amministratore era richiesto nel mio caso, altrimenti tutte le opzioni erano disabilitate.
Vezenkov,

2
Nota: crea la cartella come amministratore!
Tabrock,

6
Assicurati di eseguire fuslogvwnon solo come amministratore ma anche dal percorso corretto di Windows SDK utilizzato dal progetto Visual Studio che genera l'eccezione. Controlla il suo csproj e cerca SDK all'interno (il mio nodo SDK è chiamato TargetFrameworkSDKToolsDirectory). L'uso di una versione di fuslogvw non corrispondente sembra non catturare le eccezioni (il che ha senso ...)
Veverke

191

Se hai installato Windows SDK sul tuo computer, troverai "Fusion Log Viewer" in Microsoft SDK \ Tools (digita "Fusion" nel menu di avvio su Vista o Windows 7/8). Avviarlo, fare clic sul pulsante Impostazioni e selezionare "Log bind failure" o "Log all binds".

Se questi pulsanti sono disabilitati, tornare al menu di avvio, fare clic con il pulsante destro del mouse su Log Viewer e selezionare "Esegui come amministratore".


6
Quei pulsanti sono disabilitati per me - perché?
Tim Lovell-Smith,

14
@Tim, non l'ho mai visto prima - potrebbe avere a che fare con i privilegi di amministratore? È HKEY_LOCAL_MACHINE che viene modificato dopo tutto.
Samuel Jack,

2
"Impostazioni, errori di bind del registro" sono stati sufficienti per trovare il mio problema.
pauloya,

1
Assicurarsi che la cartella consenta l'accesso in scrittura. UAC ec: \ logs non funzionano bene con il log di fusione
Edward Wilde,

4
Proprio come una nota, se i pulsanti sono disabilitati, rieseguire il visualizzatore del registro di fusione con privilegi di amministratore.
Bruno Lopes,

86

Imposta il seguente valore di registro:

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Fusion! EnableLog] (DWORD) su 1

Per disabilitare, impostare su 0 o eliminare il valore.

[modifica]: salva il seguente testo in un file, ad esempio FusionEnableLog.reg, nel formato dell'editor del registro di Windows:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion]
"EnableLog"=dword:00000001

Quindi eseguire il file da Windows Explorer e ignorare l'avvertimento su possibili danni.


4
Non che la voce probabilmente non esisterà, dovrai crearla. Almeno, l'ho fatto quando stavo per rispondere a questa domanda poco prima dell'incidente di questa mattina :)
Jon Skeet,

3
Cosa fa il ! significare? Chiave o valore? Che dire dei sistemi a 64 bit?
Bruno Martinez,

48
in realtà, questo funziona ... devi solo eseguire iisreset afterwords per farlo funzionare.
Nick DeMayo,

4
@Norman: poiché questa particolare impostazione viene utilizzata per fare in modo che gli errori Asp.Net mostrino i messaggi di errore di associazione degli assiemi nelle pagine di errore, non per salvare i log in file. @OP: +1. Modificato per includere un file .reg. Il ! il formato è uno che non avevo mai visto, tranne nel messaggio di errore che mi ha inviato a questa pagina in cerca di risposte.
Brian,

2
Non è necessario ripristinare IIS: solo il pool di applicazioni pertinente. O almeno questo era tutto ciò che dovevo fare.
Kenny Evitt,

81

È possibile eseguire questo script Powershell come amministratore per abilitare FL:

Set-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name ForceLog         -Value 1               -Type DWord
Set-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogFailures      -Value 1               -Type DWord
Set-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogResourceBinds -Value 1               -Type DWord
Set-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogPath          -Value 'C:\FusionLog\' -Type String
mkdir C:\FusionLog -Force

e questo per disabilitare:

Remove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name ForceLog
Remove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogFailures
Remove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogResourceBinds
Remove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogPath

4
Grazie! Mi sono permesso di inserire i tuoi comandi in questo senso . E ho aggiunto la creazione del c:\FusionLogdir in modo che la gente non lo dimentichi ;-)
Oliver,

Regole della riga di comando! Potrei rapidamente riprodurlo utilizzando la migliore tecnologia di riusabilità del codice finora inventata chiamata "taglia e incolla". Grazie.
Remigijus Pankevičius,

20

Lo script del commutatore Visualizzatore impostazioni registro Fusion non è il modo migliore per farlo.

In ASP.NET , a volte è stato complicato farlo funzionare correttamente. Questa sceneggiatura funziona alla grande ed è stata elencata anche nella lista dei Power Tool di Scott Hanselman . L'ho usato personalmente per anni e non mi ha mai deluso.


ps ASSICURATI di disabilitarlo dopo l'esecuzione o questa cartella potrebbe diventare piuttosto grande
Adam Tuliper - MSFT

questo è il motivo per cui utilizzo ETW, per registrare i dati solo se ne ho davvero bisogno, non sempre in un brutto file di registro di grandi dimensioni.
magicandre1981,

13

Invece di utilizzare un brutto file di registro, puoi anche attivare il registro Fusion tramite ETW / xperf attivando il provider privato DotnetRuntime ( Microsoft-Windows-DotNETRuntimePrivate) con GUID 763FD754-7086-4DFE-95EB-C01A46FAF4CAe la FusionKeywordparola chiave (0x4).

@echo off
echo Press a key when ready to start...
pause
echo .
echo ...Capturing...
echo .

"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -on PROC_THREAD+LOADER+PROFILE -stackwalk Profile -buffersize 1024 -MaxFile 2048 -FileMode Circular -f Kernel.etl
"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -start ClrSession -on Microsoft-Windows-DotNETRuntime:0x8118:0x5:'stack'+763FD754-7086-4DFE-95EB-C01A46FAF4CA:0x4:0x5 -f clr.etl -buffersize 1024

echo Press a key when you want to stop...
pause
pause
echo .
echo ...Stopping...
echo .

"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -start ClrRundownSession -on Microsoft-Windows-DotNETRuntime:0x8118:0x5:'stack'+Microsoft-Windows-DotNETRuntimeRundown:0x118:0x5:'stack' -f clr_DCend.etl -buffersize 1024 

timeout /t 15

set XPERF_CreateNGenPdbs=1

"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -stop ClrSession ClrRundownSession 
"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -stop
"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -merge kernel.etl clr.etl clr_DCend.etl Result.etl -compress
del kernel.etl
del clr.etl
del clr_DCend.etl

Quando ora apri il file ETL in PerfView e guardi sotto la tabella degli eventi, puoi trovare i dati di Fusion:

Eventi di fusione in PerfView


@YuriBondarchuk questo lo attiva su richiesta e hai più dati nell'ETL (altri processi, dati di conversione file) in modo da poter fornire i file a altri utenti e loro possono ottenere MOLTE più informazioni rispetto al normale registro di fusione
magicandre1981

12

Ho scritto un visualizzatore di registri di binding dell'assembly chiamato Fusion ++ e l'ho messo su GitHub .

Puoi ottenere l'ultima versione da qui o via chocolatey ( choco install fusionplusplus).

Spero che tu e alcuni dei visitatori qui dentro ci risparmiate alcuni degni minuti di vita con esso.

Fusion ++


1
Caro signore, sei un dio!
Sylvain Girard,

1
È uno strumento fantastico, grazie mille!
simoneL

3

Se hai già abilitato la registrazione e ricevi ancora questo errore su Windows 7 a 64 bit, prova in IIS 7.5:

  1. Crea un nuovo pool di applicazioni

  2. Vai alle Impostazioni avanzate di questo pool di applicazioni

  3. Impostare Abilita applicazione a 32 bit su True

  4. Punta la tua applicazione web per usare questo nuovo pool


amico, mi hai salvato la giornata, ho impiegato circa 8 ore per risolvere il problema. grazie molto. :)
Dika Arta Karunia,

3

Solo un po 'di informazioni che potrebbero aiutare gli altri; se si esegue qualcosa sulla falsariga di cercare tutti gli assembly in una directory per le classi che ereditano / implementano classi / interfacce, assicurarsi di eliminare gli assembly non aggiornati se si ottiene questo errore relativo a uno dei propri assembly.

Lo scenario sarebbe qualcosa del tipo:

  1. Assembly A carica tutti gli assembly in alcune cartelle
  2. L'assembly B in questa cartella è obsoleto, ma fa riferimento all'assembly C
  3. L'assembly C esiste, ma gli spazi dei nomi, i nomi delle classi o altri dettagli potrebbero essere cambiati nel tempo trascorso da quando l'assembly B è diventato obsoleto (nel mio caso uno spazio dei nomi è stato modificato attraverso un processo di refactoring)

In breve: A --- carica -> B (stantio) --- riferimenti ---> C

In questo caso, l'unico segno rivelatore è lo spazio dei nomi e il nome della classe nel messaggio di errore. Esaminalo attentamente. Se non riesci a trovarlo da nessuna parte nella tua soluzione, probabilmente stai provando a caricare un assieme non aggiornato.


3

Per coloro che sono un po 'pigri, consiglio di eseguirlo come file bat per quando si desidera abilitarlo:

reg add "HKLM\Software\Microsoft\Fusion" /v EnableLog /t REG_DWORD /d 1 /f
reg add "HKLM\Software\Microsoft\Fusion" /v ForceLog /t REG_DWORD /d 1 /f
reg add "HKLM\Software\Microsoft\Fusion" /v LogFailures /t REG_DWORD /d 1 /f
reg add "HKLM\Software\Microsoft\Fusion" /v LogResourceBinds /t REG_DWORD /d 1 /f
reg add "HKLM\Software\Microsoft\Fusion" /v LogPath /t REG_SZ /d C:\FusionLog\

if not exist "C:\FusionLog\" mkdir C:\FusionLog

1

Nel caso ti stia chiedendo quale sia la posizione di FusionLog.exe: sai di averlo, ma non riesci a trovarlo? Cercavo FUSLOVW negli ultimi anni ancora e ancora. Dopo il passaggio a .NET 4.5 è esploso il numero della versione di FUSION LOG. I suoi sono posti dove può essere trovato sul tuo disco, a seconda del software che hai installato:

C: \ Programmi (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools \ x64

C: \ Programmi (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64

C: \ Programmi (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ x64

C: \ Programmi (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools

C: \ Programmi (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools

C: \ Programmi (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin


0

Nel mio caso ha aiutato a digitare il nome del disco in minuscolo

Sbagliato - C: \ someFolder

Corretto - c: \ someFolder

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.