Come abilitare la registrazione degli errori di binding del gruppo (Fusion) in .NET

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

Aggiungi i seguenti valori a

 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Fusion
 Inserisci:
 DWORD ForceLog ha impostato il valore su 1
 DWORD LogFailures ha impostato 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 \)

Assicurati di includere la barra rovesciata dopo il nome della cartella e che la Cartella esista .

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

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

Di solito utilizzo Fusion Log Viewer ( Fuslogvw.exe da un prompt dei comandi di Visual Studio o Fusion Log Viewer dal menu di avvio) – la mia configurazione standard è:

  • Aprire Fusion Log Viewer come amministratore
  • Clicca le 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.)
  • Assicurati che sia attivo il giusto livello di registrazione (a volte ti basta selezionare Registra tutti i collegamenti su disco solo per assicurarti che le cose funzionino correttamente)
  • Clicca OK
  • Imposta l’opzione di posizione del registro su Personalizzato

Ricorda di distriggersre la disconnessione una volta che hai finito!

(Ho appena postato questo su una domanda simile – Penso che sia rilevante anche qui.)

Se hai installato Windows SDK sul tuo computer, troverai “Fusion Log Viewer” in Microsoft SDK \ Tools (digita semplicemente “Fusion” nel menu Start su Vista o Windows 7/8). Lanciarlo, 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 tasto destro del mouse su Log Viewer e selezionare “Esegui come amministratore”.

Imposta il seguente valore di registro:

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

Per disabilitare, impostare su 0 o eliminare il valore.

[modifica]: salva il seguente testo in un file, ad es. 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 esegui il file da Windows Explorer e ignora l’avviso relativo a possibili danni.

È ansible 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 

Nota: verificare che la directory fornita per la voce LogPath esista. Se la directory non esiste, i tuoi registri non saranno recuperabili.

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 

Lo script changer di Fusion Log Settings Viewer non è il modo migliore per farlo.

In ASP.NET , a volte è stato complicato farlo funzionare correttamente. Questo script funziona alla grande ed è stato elencato anche nella lista di Power Hans di Scott Hanselman . L’ho usato personalmente per anni e non mi ha mai deluso.

Invece di utilizzare un brutto file di registro, è ansible triggersre il registro Fusion tramite ETW / xperf triggersndo il provider privato DotnetRuntime ( Microsoft-Windows-DotNETRuntimePrivate ) con GUID 763FD754-7086-4DFE-95EB-C01A46FAF4CA e la parola chiave FusionKeyword (0x4) sopra.

 @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 apri il file ETL in PerfView e guardi sotto la tabella Eventi, puoi trovare i dati Fusion:

Eventi di fusione in PerfView

Solo un po ‘di informazioni che potrebbero aiutare gli altri; Se si fa qualcosa sulla falsariga di cercare tutti gli assembly in qualche directory per le classi che ereditano / implementano le classi / interfacce, assicurarsi di pulire gli assembly stantii se si ottiene questo errore relativo a uno dei propri assembly.

Lo scenario sarebbe qualcosa di simile:

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

In breve: A — loads -> B (stale) — riferimenti —> C

Se ciò accade, l’unico segno rivelatore è lo spazio dei nomi e il nome della class nel messaggio di errore. Esaminalo da vicino. Se non riesci a trovarlo da nessuna parte nella tua soluzione, probabilmente stai tentando di caricare un assemblaggio obsoleto.

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

  1. Creare 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. Puntare la propria applicazione Web per utilizzare questo nuovo pool