Создание или поиск альтернативы для fuslogvw.exe, он же Fusion Assembly Binding Log Viewer

Средство просмотра журнала привязки сборки довольно глючное (например, чаще всего оно не очищает журнал) и довольно мало функций (поиск, упорядочивание, фильтрация почти доступны).

Поэтому мне было интересно, либо

  • Существует существующая альтернатива
  • Как-то возможно глобально перехватывать события Assemblyresolve, поэтому я могу сделать это сам.
  • Microsoft где-то опубликовала исходный код, и нам разрешено его разветвлять.

За исключением второго варианта, я знаю, что вы можете создать реализацию CLR Host относительно просто (хотя и нетривиально), но это кажется излишним, если все, что вам нужно, — это немного более тонкий контроль, чем существующее средство просмотра журнала Fusion.

Обратите внимание: я видел этот ответ, но, похоже, он не отвечает на этот вопрос. вопрос.


В ответ на некоторые комментарии:

В ответ на некоторые комментарии: я знаю о перенаправлении сборки, событиях AssemblyResolve и AssemblyLoad, но первое можно использовать только в крайнем случае (последнее в цепочке проверки), а второе сработает только после сборка загружена. Ни один из них не может использоваться в других процессах, кроме вашего собственного, и ни один из них не может показать весь процесс зондирования.

Я заметил, что при использовании RyuJIT некоторые привязки выглядят немного по-другому, в другом порядке в результате другого способа компиляции и загрузки скомпилированного IL. Хотя мне удалось исследовать и решить проблемы с привязкой, я очень не люблю fuslogvw.exe как трудоемкий (хотя и единственный в своем роде и полезный) инструмент. Поэтому я начал (довольно бесплодный) поиск лучшего инструмента для наблюдения за процессом зондирования.


person Abel    schedule 10.12.2015    source источник
comment
Обрабатывает ли AppDomain.AssemblyLoad что ты ищешь? Это даст вам возможность проверять каждую сборку, загружаемую в домен приложения. Событие AppDomain.AssemblyResolve предоставляет все сборки до их загрузки, что позволяет определить ошибки сборки.   -  person xxbbcc    schedule 10.12.2015
comment
@xxbbcc, Спасибо за предложение, но я уже использую их. Они не помогут решить проблемы этими методами, к тому же один сбой означает, что все сломаются. Мне нужен внепроцессный метод, такой как слияние, но желательно под моим контролем.   -  person Abel    schedule 10.12.2015
comment
Я не уверен, что понимаю, что вы подразумеваете под одним сбоем, означающим, что все потерпят неудачу - сбой загрузки сборки - это конец процесса. Что средство просмотра журнала Fusion покажет по-другому? Ваш вопрос кажется очень расплывчатым в отношении того, что вам нужно (кроме того, что вам нужен другой способ отслеживания привязки сборки?)   -  person xxbbcc    schedule 10.12.2015
comment
@xxbbcc, упомянутые вами события служат способом разрешения ограниченного набора случаев из вашей собственной сборки, но их нельзя использовать с другими сборками в других процессах. Кроме того, есть случаи, которые можно решить с помощью перенаправления привязки app.config, но не с помощью AssemblyResolve (т. е. перенаправления со строгим именем). Через управляемый код, на самом деле, нет возможности показать весь процесс зондирования, только fuslogvw.exe может их показать, но этот инструмент архаичен и ужасно неудобен в использовании. Я надеюсь на лучший способ контролировать процесс зондирования. Я думаю, что я должен свернуть свой собственный (и, возможно, поделиться с сообществом;).   -  person Abel    schedule 11.12.2015
comment
Ах, хорошо — если вы пытаетесь отслеживать сторонние процессы, вам нужен автономный инструмент.   -  person xxbbcc    schedule 11.12.2015
comment
@xxbbcc не только это, но и следить за моим собственным процессом. Например, это отличается, когда я привязываю событие AssemblyResolve к <Module>.cctor (в этом случае Fusion терпит неудачу, потому что я терплю неудачу) или в более обычном месте в коде (в этом случае Fusion иногда завершается успешно, потому что он разрешает его до того, как я привязываю событие ). Он также завершается с ошибкой или успешно в зависимости от хост-процесса (например, сбой nUnit, успех NCrunch). Для решения подобных проблем Fusion Log Viewer является необходимым злом. Я обновил вопрос, надеюсь, теперь он немного понятнее.   -  person Abel    schedule 11.12.2015
comment
PS: я обнаружил, почему nUnit runner дает сбой, а nCrunch - нет, это связано с тем, как они создают теневые копии сборок, и с тем, как это приводит к тому, что Fusion не находит свои ссылки. Но тем не менее, это кропотливый процесс, чтобы найти эти проблемы. Так что все, что лучше, чем fuslogvw, очень приветствуется.   -  person Abel    schedule 11.12.2015
comment
Да, я понимаю вашу боль - я написал (некоторое время назад) преобразователь сборки, который пытался максимально точно имитировать весь процесс разрешения сборки (включая перенаправления привязки и т. д.). Он был проприетарным, поэтому я не могу предложить исходный код. но я знаю, насколько сложен и недостаточно задокументирован процесс связывания.   -  person xxbbcc    schedule 11.12.2015
comment
@xxbbcc, если вам удалось решить проблему, когда вы пытаетесь перенаправить сборку со строгим именем на другую сборку со строгим именем (в моем случае обычно FSharp.Core 4.3–4.4) с событием AssemblyResolve, то я хотел бы услышать об этом ( если раскрытие этой части разрешено). Он работает с bindingRedirect внутри app.config, но в некоторых случаях мне это нужно из кода (когда просто dll загружается другим процессом, он не будет соблюдать настройки .config). Сборки без строгих имен я могу связать с чем угодно, но Fusion не позволяет мне перенаправлять сборки со строгими именами.   -  person Abel    schedule 11.12.2015
comment
Нет, это не было сделано во время выполнения, поэтому я не использовал эти события. Это было частью инструмента, который анализировал IL и отображал все отношения типов, поэтому мне приходилось находить и загружать сборки, как если бы они загружались во время выполнения (собственного). Однако мой инструмент на самом деле имитировал процесс привязки, а не использовал его — мне приходилось анализировать файлы конфигурации, искать сборки в GAC и в локальных папках Bin и выяснять, какие сборки будут загружены в конце. Это был довольно сложный процесс.   -  person xxbbcc    schedule 11.12.2015
comment
Он обрабатывал несколько второстепенных случаев, но я не могу сказать, правильно это или нет, потому что у меня никогда не было определенного поведения для начала. Это потребовало большого количества экспериментов с различными макетами папок и различными переадресациями привязки.   -  person xxbbcc    schedule 11.12.2015
comment
@xxbbcc, звучит как тяжелая работа! Я знаю, что могу использовать наш собственный хост-процесс clr (используемый для совершенно другой цели), но это только усложнит задачу и создаст проблемы с переносимостью. В любом случае, спасибо за помощь и размышления. Если позволит время, я сделаю свой собственный регистратор сплавов. В настоящее время мне придется довольствоваться событиями, которые уже есть, и я буду придерживаться ручного процесса исправления крайних случаев.   -  person Abel    schedule 11.12.2015
comment
Возможно, вы уже знакомы с этим, но это то, что я использовал в качестве базовой документации, когда работал над этим проектом: msdn.microsoft.com/en-us/library/7wd6ex19%28v=vs.110%29.aspx   -  person xxbbcc    schedule 11.12.2015
comment
@xxbbcc, tx, да, я знаком с этим, он объясняет основы перенаправления сборки.   -  person Abel    schedule 11.12.2015


Ответы (1)


Возможно, вы опоздали на вечеринку, но, возможно, некоторых из вас заинтересует современная альтернатива FUSLOGVW.exe, которую я недавно разместил на GitHub: Фьюжн++

Фьюжн++

Он очень прост в использовании: просто нажмите «Запись», чтобы записать журналы сборки. Если вы закончили, нажмите «Стоп» еще раз, и Fusion++ проанализирует все файлы журналов за вас.

Под капотом он использует те же механизмы, что и старый добрый FUSLOGVW.exe.

person Waescher    schedule 07.06.2019
comment
Звучит безподобно! Я сам несколько раз обдумывал эту идею, но FuslogVw использует недокументированные вызовы API, поэтому полная переработка оказалась сложной. Я так понимаю, вы в основном используете существующий механизм и отображаете его более осмысленно? - person Abel; 14.06.2019
comment
Кроме того, это единственный ответ за 4 года, и Microsoft ничего не сделала для улучшения или открытия исходного кода FuslogVw.exe, поэтому я очень доволен этой попыткой :) - person Abel; 14.06.2019
comment
Рад помочь, и да, я просто активирую ведение журнала .NET по умолчанию через реестр Windows (абстрагируя настройки и пути журнала от пользователя, потому что зачем ему это?) и убеждаюсь, что все возвращается после остановки сеанса. Затем Fusion++ анализирует файлы и переносит их в пользовательский интерфейс, чтобы вы не могли самостоятельно сканировать файловую систему. - person Waescher; 14.06.2019