2009-12-22 3 views
4

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

Проблема заключается в следующем: для IIS 6 мы создаем virt dirs, вызывая API WMI/Metabase, для 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.

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

ответ

1

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

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

и книге экстракта на www.informit.com/articles/article.aspx?p=30601 & SEQNUM = 5 (выписку из «Essential .NET, том I: время выполнения Common Language»).

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

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

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

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

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

Смежные вопросы