Почему среда выполнения .NET / Fusion не всегда загружает все ссылочные сборки из манифеста? - PullRequest
2 голосов
/ 25 января 2012

Это все началось, потому что я пытаюсь FxCop проанализировать мою сборку, которая ссылается на Crystal Reports . Каждый раз, когда я это делаю, FxCop не может найти ссылку на сборку с именем "BusinessObjects.Licensing.KeycodeDecoder". Пытаясь найти этот .dll, я пришел к выводу, что он вообще не существует ... он не находится на жестком диске или GAC , но само мое приложение работает и отображает отчеты просто хорошо.

Так что это привело меня к охоте ...

В файле CrystalDecisions.CrystalReports.Engine.dll, если вы откроете его в ILDASM , он включит ссылку в свой манифест:

.assembly extern BusinessObjects.Licensing.KeycodeDecoder
{
  .publickeytoken = (69 2F BE A5 52 1E 13 04 )                         // i/..R...
  .ver 13:0:2000:0
}

Однако, если я открываю Fusion Logger (fuslogvw) и запускаю свое приложение, я вижу, как Fusion загружает несколько сборок Crystal, включая CrystalDecisions.CrystalReports.Engine, но указанная сборка BusinessObjects.Licensing.KeycodeDecoder является , даже не пытаясь для загрузки.

Так ... почему? Как среда выполнения .NET знает, что пропустить или не загружать эту ссылку во время выполнения? Почему Fusion не загружает каждую ссылочную сборку рекурсивно? Я просто ищу какую-то логику, рассуждения или конструктивные намерения за всем этим ...

Возможно, не менее важно, почему могут создаваться проекты .NET, имеющие ссылки на .dll, но эти ссылки не применяются? IMO, неправильно, что SAP может поставлять сборки Crystal, которые ссылаются на другие сборки, которые даже не устанавливаются.

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Он загружает их исключительно по требованию.Манифест используется для определения местоположения правильной сборки (включая правильную версию, строгое имя и т.Обратите внимание, что сборки могут также загружаться только для получения Type класса, например, через имя типа с указанием сборки в файле конфигурации.

0 голосов
/ 25 января 2012

Он загружает сборку только тогда, когда она фактически используется. Поэтому, если код внутри сборки фактически никогда не выполняется, сборка никогда не будет загружена или попытаться загрузить.

...