Wie aktiviere ich die Protokollierung von Assemblybindungsfehlern (Fusion) in .NET?
fuslogvw.exe
als Administrator ausgeführt werden, um Rechteprobleme zu vermeiden.
Wie aktiviere ich die Protokollierung von Assemblybindungsfehlern (Fusion) in .NET?
fuslogvw.exe
als Administrator ausgeführt werden, um Rechteprobleme zu vermeiden.
Antworten:
Fügen Sie die folgenden Werte hinzu
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Fusion Hinzufügen: DWORD ForceLog setzt den Wert auf 1 DWORD LogFailures setzt den Wert auf 1 DWORD LogResourceBinds setzt den Wert auf 1 DWORD EnableLog setzt den Wert auf 1 String LogPath setzt den Wert für Protokolle auf Ordner (z. B. C: \ FusionLog \)
Stellen Sie sicher, dass Sie den Backslash nach dem Ordnernamen einfügen und dass der Ordner vorhanden ist .
Sie müssen das ausgeführte Programm neu starten, um das Lesen dieser Registrierungseinstellungen zu erzwingen.
Vergessen Sie übrigens nicht, die Fusionsprotokollierung zu deaktivieren, wenn sie nicht benötigt wird.
Normalerweise verwende ich den Fusion Log Viewer ( Fuslogvw.exe über eine Visual Studio-Eingabeaufforderung oder Fusion Log Viewer über das Startmenü). Mein Standard-Setup lautet:
c:\FusionLogs
( Wichtig: Stellen Sie sicher, dass Sie diesen Ordner tatsächlich im Dateisystem erstellt haben.)Denken Sie daran, die Abmeldung zu deaktivieren, wenn Sie fertig sind!
(Ich habe dies gerade zu einer ähnlichen Frage gepostet - ich denke, es ist auch hier relevant.)
fuslogvw
nicht nur als Administrator ausgeführt werden, sondern auch über den richtigen Windows SDK-Pfad, den das Visual Studio-Projekt verwendet, das die Ausnahme auslöst. Überprüfen Sie das csproj und suchen Sie nach SDK (mein SDK-Knoten heißt TargetFrameworkSDKToolsDirectory
). Die Verwendung einer nicht passenden fuslogvw-Version scheint die Ausnahmen nicht zu erfassen (was Sinn macht ...)
Wenn Sie das Windows SDK auf Ihrem Computer installiert haben, finden Sie den "Fusion Log Viewer" unter Microsoft SDK \ Tools (geben Sie einfach "Fusion" im Startmenü unter Vista oder Windows 7/8 ein). Starten Sie es, klicken Sie auf die Schaltfläche Einstellungen und wählen Sie "Protokollbindungsfehler" oder "Alle Bindungen protokollieren".
Wenn diese Schaltflächen deaktiviert sind, kehren Sie zum Startmenü zurück, klicken Sie mit der rechten Maustaste auf den Protokoll-Viewer und wählen Sie "Als Administrator ausführen".
Legen Sie den folgenden Registrierungswert fest:
[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Fusion! EnableLog] (DWORD) auf 1
Zum Deaktivieren auf 0 setzen oder den Wert löschen.
[Bearbeiten]: Speichern Sie den folgenden Text in einer Datei, z. B. FusionEnableLog.reg, im Windows Registry Editor-Format:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion]
"EnableLog"=dword:00000001
Führen Sie dann die Datei im Windows Explorer aus und ignorieren Sie die Warnung vor möglichen Schäden.
Sie können dieses Powershell-Skript als Administrator ausführen, um FL zu aktivieren:
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
und dieses zu deaktivieren:
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
c:\FusionLog
Verzeichnisses hinzugefügt, damit die Leute das nicht vergessen ;-)
Das Änderungsskript des Fusion Log Settings Viewer ist nicht der beste Weg, dies zu tun.
In ASP.NET war es manchmal schwierig, dies richtig zum Laufen zu bringen. Dieses Skript funktioniert hervorragend und wurde auch in der Liste der Elektrowerkzeuge von Scott Hanselman aufgeführt . Ich persönlich habe es jahrelang benutzt und es hat mich nie im Stich gelassen.
Anstatt eine hässliche Protokolldatei zu verwenden, können Sie das Fusion-Protokoll auch über ETW / xperf aktivieren, indem Sie den DotnetRuntime Private Provider ( Microsoft-Windows-DotNETRuntimePrivate
) mit aktivierter GUID 763FD754-7086-4DFE-95EB-C01A46FAF4CA
und dem FusionKeyword
Schlüsselwort (0x4) aktivieren.
@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
Wenn Sie jetzt die ETL-Datei in PerfView öffnen und in der Ereignistabelle nachsehen, finden Sie die Fusion-Daten:
Ich habe einen Assembly Binding Log Viewer namens Fusion ++ geschrieben und auf GitHub gestellt .
Sie können die neueste Version hier oder überocolatey ( choco install fusionplusplus
) erhalten.
Ich hoffe, Sie und einige der Besucher hier können damit einige lebenslange Minuten sparen.
Wenn Sie die Protokollierung bereits aktiviert haben und dieser Fehler unter Windows 7 64-Bit weiterhin auftritt, versuchen Sie dies in IIS 7.5:
Erstellen Sie einen neuen Anwendungspool
Wechseln Sie zu den erweiterten Einstellungen dieses Anwendungspools
Setzen Sie die Option 32-Bit-Anwendung aktivieren auf True
Zeigen Sie mit Ihrer Webanwendung auf diesen neuen Pool
Nur eine kleine Information, die anderen helfen könnte; Wenn Sie alle Assemblys in einem Verzeichnis nach Klassen durchsuchen, die Klassen / Schnittstellen erben / implementieren, müssen Sie veraltete Assemblys bereinigen, wenn dieser Fehler bei einer Ihrer eigenen Assemblys auftritt.
Das Szenario wäre ungefähr so:
Kurzum: A --- lädt -> B (veraltet) --- Referenzen ---> C.
In diesem Fall ist das einzige verräterische Zeichen der Namespace und der Klassenname in der Fehlermeldung. Untersuche es genau. Wenn Sie es in Ihrer Lösung nirgendwo finden, versuchen Sie wahrscheinlich, eine veraltete Baugruppe zu laden.
Für diejenigen, die etwas faul sind, empfehle ich, diese Datei als Bat-Datei auszuführen, wenn Sie sie aktivieren möchten:
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
Nur für den Fall, dass Sie sich über den Speicherort von FusionLog.exe wundern - Sie wissen, dass Sie ihn haben, aber Sie können ihn nicht finden? Ich habe in den letzten Jahren immer wieder nach FUSLOVW gesucht. Nach dem Wechsel zu .NET 4.5 ist die Anzahl der Versionen von FUSION LOG explodiert. Je nachdem, welche Software Sie installiert haben, befinden sich diese auf Ihrer Festplatte:
C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools \ x64
C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64
C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ x64
C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools
C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools
C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin