Когда CLR пытается загрузить ссылочную сборку? - PullRequest
4 голосов
/ 22 декабря 2009

Я хочу написать небольшое приложение-установщик, которое устанавливает веб-сайт и создает виртуальные каталоги IIS. Приложение должно работать на Windows XP / Server 2003 (IIS 6), а также на Vista / 2008 (IIS 7).

Проблема в том, что для IIS 6 мы создаем виртуальные каталоги, вызывая WMI / Metabase API, для IIS 7 существует гораздо лучший API: Microsoft.Web.Administration, но его сборка доступна только в системах IIS 7.

Наивный подход:

...
if (OperatingSystem == old)
{
    call metabase API...
}
else
{
    call Microsoft.Web.Administration...
}
...

Хорошо, не правда ли? Но как я могу убедиться, что это не приведет к сбою в старой системе при попытке загрузить DLL-библиотеку Microsoft.Web.Administration? Или сборка только что загружена, когда она впервые используется? Когда метод, который вызывает сборку, используется впервые?

Я полагаю, что тестирование не поможет без какого-либо детерминизма, гарантируемого спецификацией CLR / .NET.

Я с нетерпением жду вашего опыта, подсказок или решений по этой теме. Пока я не нашел в Интернете ничего пригодного для удаленного использования.

Ответы [ 2 ]

1 голос
/ 22 декабря 2009

Лично вместо того, чтобы пытаться полагаться на какое-либо встроенное поведение JIT, я бы вообще переместил зависимость от Microsoft.Web.Administration в другую сборку.

Затем, где-нибудь в вызывающей сборке, я бы проверил, присутствует ли %systemroot%\inetsrv\Microsoft.Web.Administration.dll. Если это так, то я предполагаю, что использую управляемый интерфейс, и вызываю сборку; если нет, я бы вернулся к метабазе API.

1 голос
/ 22 декабря 2009

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

http://msdn.microsoft.com/en-us/magazine/cc163655.aspx (раздел «Загрузка меньшего количества модулей при запуске»)

и выдержку из книги по адресу www.informit.com/articles/article.aspx?p=30601&seqNum=5 (выдержка из "Essential .NET, том I: среда выполнения общего языка").

JIT CLR загрузит необходимую сборку только тогда, когда это необходимо для компиляции метода. Таким образом, вы должны перенести любое использование Microsoft.Web.Administration ... на отдельный метод, который вызывается только тогда, когда вы уверены, что сборка существует в системе. То есть

   setup()
   { 
       if ( Operating.System == Old )
          call metabase API
       else
          doIIS7Setup()
   }

   void doIIS7Setup()
   {
     call Microsoft.Web.Administration ....
   }
...