Могу ли я определить, что вызвало загрузку сборки? - PullRequest
2 голосов
/ 12 октября 2009

Когда установщик службы Windows запускает «Ошибка 1001. Невозможно получить типы установщика в сборке MyService.exe». Поэтому он не может загрузить MyServiceInstaller. Журнал Fusion показывает, что происходит сбой при попытке найти мою сборку Data.dll.

Дело в том, что не нужно загружать Data.dll для создания объекта моего установщика службы. Я думал, что загрузка типов не была запущена до того, как был вызван метод, содержащий эти типы. Некоторые методы MyServiceInstaller ссылаются на типы из Data.dll, но не на ctor.

Как будто процесс загрузки MyService.exe или проверки MyServiceInstaller вызывает загрузку Data.dll.

Насколько я понимаю, регистрация в fusion не скажет мне, что мне нужно знать. Слишком поздно в этот момент. Мне нужно знать, что происходит с загрузкой MyServer.exe или проверкой MyServiceInstaller, которая в первую очередь инициировала загрузку Data.dll.

Существует бизнес-требование, согласно которому Data.dll нельзя размещать рядом с MyService.exe. И действительно, это решает эту проблему. У меня есть пользовательское событие AssemblyResolve, которое загружает Data.dll в обычном режиме.

Ответы [ 2 ]

1 голос
/ 15 октября 2009

Попробуйте подключить отладчик к установщику и отключить его при возникновении исключения (вы можете настроить его в Visual Studio в разделе Отладка / Исключения). Обычно должно быть FileNotFoundException или что-то подобное, внутренне генерируемое в установщике при сбое загрузки сборки, которое, вероятно, перехватывается где-то еще, но если вы заставляете отладчик прерываться, когда генерируется исключение не , когда он не обработан), вы можете вмешаться и получить трассировку стека, которая должна помочь вам выяснить, что именно вызвало проблему.

Вы должны увидеть что-то подобное в трассировке стека:

  • [Uninteresting native and / or external code]
  • SomeClassInYourInstaller.SomeMethod() <-- this is the responsible method
  • SomeOtherStuff.SomeMethod()
  • ...etc...
0 голосов
/ 15 октября 2009

Возможно, существует переменная экземпляра (поле) типа, определенного в Data.dll; когда загружается MyServiceInstaller, типы для всех полей должны быть доступны, даже если они не используются, потому что класс компилируется, если создается экземпляр.

...