Как остановить ASP.NET от загрузки всех сборок из bin при первой загрузке - PullRequest
16 голосов
/ 03 февраля 2009

Собственное приложение DotNet загрузит все ссылочные сборки (и их ссылки) при первом использовании. Однако ASP.NET загрузит все ссылочные сборки (и их ссылки) при первом доступе.

  1. Правильно ли это понимание?

  2. Есть ли способ заставить ASP.NET загружать сборки по требованию (например, локальные приложения)?

  3. Конкретный сценарий, который я пытаюсь решить:

    • Папка bin содержит 2 файла: A.dll и B.dll .
    • A.dll ссылки B.dll .
    • B.dll ссылки C.dll , который находится где-то еще в системе. В этом случае C.dll отсутствует.
    • A.dll загружается (используя отражение) основным приложением.
    • Обнаруженная ошибка ( Не удалось загрузить файл или сборку ... ) связана с отсутствующей зависимостью B.dll .
    • Мы хотим, чтобы приложение функционировало как обычно, если отсутствует C.dll , поскольку это необязательный компонент основного приложения.
    • Мы не можем контролировать содержимое B.dll или C.dll .

Ответы [ 2 ]

26 голосов
/ 03 февраля 2009

Чтобы ответить на пункт 3, параметр, который заставляет все сборки в папке bin загружаться при первом доступе, находится в файле C: \ winnt \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG \ web.config (в зависимости от вашей среды). Выдержка из этого файла:

<system.web>
    <compilation>
        <assemblies>
            <add assembly="*" />
        </assemblies>
    </compilation>
</system.web>

Все сборки, соответствующие шаблону, загружаются как часть начальной компиляции.

Изменив файл web.config для приложения ( НЕ глобальный DotNet) для включения сборки веб-службы и исключения совпадения с подстановочными знаками, создается впечатление, что приложение может работать, если отсутствуют дополнительные зависимости :

<system.web>
    <compilation>
        <assemblies>
            <remove assembly="*" />
            <add assembly="Main.Application.WebService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=YOURKEYHERE" />
        </assemblies>
    </compilation>
</system.web>

Мы все еще экспериментируем с этим, поэтому не уверены, что это полностью решит проблему или имеет какие-либо необычные побочные эффекты.

3 голосов
/ 03 февраля 2009

asp.net загружает все необходимые сборки, поскольку рабочий процесс создает домен приложения со всеми необходимыми сборками для каждого экземпляра.

Если вы хотите загружать сборки по требованию, попробуйте использовать отражение таким образом, чтобы вы могли контролировать, когда и когда загружать сборки.

** редактировать: **

если у вас нет контроля над B и C, но вы говорите, что B для работы нужен C, а A жестко ссылается на B. Для меня это звучит так, как будто вам нужны компоненты ABC для работы, вы можете попробовать удалить Б зависимость от А, сделав его слабой парой.

Вы можете использовать отражение, чтобы загрузить B из A, но если B все еще нужен C, он по-прежнему вызывает проблемы.

как ваше решение компилируется без компонента C?

C хранится в GAC?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...