Como habilitar o log de falha de binding de assembly (Fusion) no .NET

Como faço para habilitar o log de falhas de binding de assembly (Fusion) no .NET?

Adicione os seguintes valores para

 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Fusion
 Adicionar:
 DWORD ForceLog set valor para 1
 DWORD LogFailures define o valor como 1
 DWORD LogResourceBinds definir valor para 1
 DWORD EnableLog set valor para 1
 String LogPath define o valor para a pasta para logs (por exemplo, C: \ FusionLog \)

Certifique-se de include a barra invertida após o nome da pasta e de que a pasta existe .

Você precisa reiniciar o programa que está sendo executado para forçá-lo a ler essas configurações do registro.

BTW, não se esqueça de desligar o log de fusão quando não for necessário.

Eu costumo usar o Fusion Log Viewer ( Fuslogvw.exe a partir de um prompt de comando do Visual Studio ou Fusion Log Viewer no menu Iniciar) – minha configuração padrão é:

  • Open Fusion Log Viewer como administrador
  • Clique em configurações
  • Marque a checkbox de seleção Ativar caminho de log personalizado
  • Digite o local no qual você deseja que os registros sejam gravados, por exemplo, c:\FusionLogs ( Importante: verifique se você criou essa pasta no sistema de arquivos).
  • Certifique-se de que o nível correto de log está ativado (às vezes, apenas seleciono Registrar todos os vínculos no disco apenas para garantir que as coisas estejam funcionando corretamente)
  • Clique OK
  • Definir a opção de localização do log como Custom

Lembre-se de desligar o log quando terminar!

(Eu acabei de postar isso em uma pergunta semelhante – eu acho que é relevante aqui também).

Se você tiver o Windows SDK instalado em sua máquina, você encontrará o “Fusion Log Viewer” em Microsoft SDK \ Tools (basta digitar “Fusion” no menu Iniciar no Vista ou no Windows 7/8). Lançamento, clique no botão Configurações e selecione “Log bind failure” ou “Log all binds”.

Se esses botões estiverem desativados, volte ao menu Iniciar, clique com o botão direito do mouse no Visualizador de registros e selecione “Executar como administrador”.

Defina o seguinte valor do Registro:

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

Para desativar, defina como 0 ou exclua o valor.

[edit]: Salve o seguinte texto em um arquivo, por exemplo, FusionEnableLog.reg, no Formato do Editor do Registro do Windows:

 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion] "EnableLog"=dword:00000001 

Em seguida, execute o arquivo do Windows Explorer e ignore o aviso sobre possíveis danos.

Você pode executar este script Powershell como administrador para ativar o 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: Assegure-se de que o diretório fornecido para a input LogPath exista. Se o diretório não existir, seus logs não serão recuperáveis.

e este para desativar:

 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 

O script do trocador do Fusion Log Settings Viewer não é a melhor maneira de fazer isso.

No ASP.NET , tem sido difícil às vezes fazer com que isso funcione corretamente. Este script funciona muito bem e também foi listado na lista Power Tool de Scott Hanselman . Eu pessoalmente usei isso por anos e nunca me decepcionou.

Em vez de usar um arquivo de log feio, você também pode ativar o log do Fusion via ETW / xperf ativando o provedor Privado DotnetRuntime ( Microsoft-Windows-DotNETRuntimePrivate ) com o GUID 763FD754-7086-4DFE-95EB-C01A46FAF4CA e a palavra-chave FusionKeyword (0x4) em.

 @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 você abrir o arquivo ETL no PerfView e procurar na tabela Eventos, você poderá encontrar os dados do Fusion:

Eventos de fusão no PerfView

Apenas um pouquinho de informação que possa ajudar os outros; Se você fizer algo ao longo das linhas de pesquisar todos os assemblies em algum diretório para classs que herdam / implementam classs / interfaces, certifique-se de limpar os assemblies obsoletos se você receber esse erro pertencente a um dos seus próprios assemblies.

O cenário seria algo como:

  1. A assembly A carrega todos os assemblies em alguma pasta
  2. O assembly B nesta pasta é obsoleto, mas faz referência ao assembly C
  3. Assembly C existe, mas namespaces, nomes de classs ou outros detalhes podem ter mudado no tempo que passou desde que o assembly B se tornou obsoleto (no meu caso, um namespace foi alterado através de um processo de refatoração)

Resumindo: A — carrega -> B (obsoleto) — referências —> C

Se isso acontecer, o único sinal indicador será o namespace e o nome da class na mensagem de erro. Examine-o de perto. Se você não conseguir encontrá-lo em qualquer lugar em sua solução, provavelmente está tentando carregar um assembly obsoleto.

Se você já tiver o log ativado e ainda assim receber esse erro no Windows 7 de 64 bits, tente isso no IIS 7.5:

  1. Crie um novo pool de aplicativos

  2. Vá para as configurações avançadas deste pool de aplicativos

  3. Definir o aplicativo de habilitar 32 bits para True

  4. Aponte seu aplicativo da web para usar esse novo pool