Wie aktiviere ich die Protokollierung der Assembly-Bindungsfehler (Fusion) in .NET
Fügen Sie die folgenden Werte zu hinzu
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion Hinzufügen: DWORD ForceLog-Wert auf 1 gesetzt DWORD LogFailures-Wert auf 1 setzen 1 String LogPath legt den Wert für den Ordner für Protokolle fest (z. B. C:\FusionLog \)
Stellen Sie sicher, dass Sie den Backslash nach dem Ordnernamen und dem Ordner enthalten enthalten.
Sie müssen das Programm, das Sie ausführen, neu starten, um das Lesen dieser Registrierungseinstellungen zu erzwingen.
Übrigens, vergessen Sie nicht, die Fusionsprotokollierung zu deaktivieren, wenn sie nicht benötigt wird.
Normalerweise verwende ich den Fusion Log Viewer ( Fuslogvw.exe aus einer Eingabeaufforderung von Visual Studio oder den Fusion Log Viewer aus dem Startmenü) - meine Standardeinstellung ist:
c:\FusionLogs
(Important: Stellen Sie sicher, dass Sie diesen Ordner im Dateisystem erstellt haben.)Denken Sie daran, sich abzumelden, wenn Sie fertig sind!
(Ich habe dies gerade zu einer ähnlichen Frage gepostet - ich denke, es ist auch hier relevant.)
Wenn Sie das Windows SDK auf Ihrem Computer installiert haben, finden Sie den "Fusion Log Viewer" unter Microsoft SDK\Tools (geben Sie einfach "Fusion" in das Startmenü von Vista oder Windows 7/8 ein). Starten Sie es, klicken Sie auf die Schaltfläche Einstellungen und wählen Sie "Fehler beim Protokollieren der Bindung" 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" aus.
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, inWindows Registry Editor Format:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion]
"EnableLog"=dword:00000001
Führen Sie dann die Datei über den 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
Hinweis: Stellen Sie sicher, dass das für den LogPath-Eintrag angegebene Verzeichnis vorhanden ist. Wenn das Verzeichnis nicht vorhanden ist, können Ihre Protokolle nicht abgerufen werden.
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
Das Fusion Log Settings Viewer-Änderungsskript ist keine der beste Weg, dies zu tun.
In ASP.NET war es manchmal schwierig, dies richtig zu machen. Dieses Skript ist großartig und wurde auch auf Scott Hanselmans Power Tool-Liste aufgeführt. Ich habe es seit Jahren persönlich benutzt und es hat mich nie im Stich gelassen.
Anstatt eine unschöne Protokolldatei zu verwenden, können Sie das Fusion-Protokoll auch über ETW/xperf aktivieren, indem Sie den DotnetRuntime Private-Provider (Microsoft-Windows-DotNETRuntimePrivate
) mit GUID 763FD754-7086-4DFE-95EB-C01A46FAF4CA
und dem Schlüssel FusionKeyword
(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 nun die ETL-Datei in PerfView öffnen und unter der Ereignistabelle suchen, finden Sie die Fusion-Daten:
Nur ein kleines bisschen Info, das anderen helfen könnte; Wenn Sie in einem Verzeichnis nach allen Assemblys nach Klassen suchen, die Klassen/Schnittstellen erben/implementieren, müssen Sie veraltete Assemblys bereinigen, wenn Sie diesen Fehler in einer Ihrer eigenen Assemblys erhalten.
Das Szenario wäre ungefähr so:
Kurz gesagt: A --- lädt -> B (veraltet) --- Referenzen ---> C
In diesem Fall ist das einzige Kontrollzeichen der Namespace und der Klassenname in der Fehlernachricht. Untersuche es genau. Wenn Sie es nirgendwo in Ihrer Lösung finden, versuchen Sie wahrscheinlich, eine veraltete Assembly zu laden.
Wenn Sie die Protokollierung bereits aktiviert haben und dieser Fehler unter Windows 7 64 Bit weiterhin angezeigt wird, versuchen Sie dies in IIS 7.5:
Erstellen Sie einen neuen Anwendungspool
Wechseln Sie zu den erweiterten Einstellungen dieses Anwendungspools
Setzen Sie die Enable 32-Bit Application auf True
Verweisen Sie auf Ihre Webanwendung, um diesen neuen Pool zu verwenden
Nur für den Fall, dass Sie sich fragen, wo FusionLog.exe liegt. Sie wissen, dass Sie es haben, aber Sie können es nicht finden? Ich habe in den letzten Jahren immer wieder nach FUSLOVW gesucht. Nach dem Wechsel zu .NET 4.5 ist die Versionsnummer von FUSION LOG explodiert. Dies sind Orte, an denen Sie sich auf Ihrer Festplatte befinden, abhängig von der installierten Software:
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
In meinem Fall half es, den Namen der Festplatte in Kleinbuchstaben einzugeben
Falsch - C:\someFolder
Korrigieren Sie - c:\someFolder
Seit mein Tweet about Fusion ++ von Scott Hanselman selbst retweetet wurde, bin ich zuversichtlich, Ihnen davon zu erzählen.
Ich habe einen (verbesserungsfähigen) Assembly Binding Log Viewer namens Fusion ++ geschrieben und auf GitHub abgelegt.
Ich hoffe, Sie und einige der Besucher hier können sich damit ein paar lebenslange Minuten sparen.
Für diejenigen, die ein bisschen faul sind, empfehle ich, diese Datei als Fledermausdatei 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