2009-12-22 3 views
4

웹 사이트를 설치하고 IIS 가상 디렉터리를 만드는 작은 설치 프로그램을 작성하고 싶습니다. 이 응용 프로그램은 Windows XP/Server 2003 (IIS 6)과 Vista/2008 (IIS 7)에서 실행해야합니다.CLR은 언제 참조 된 어셈블리를로드하려고합니까?

문제점 : IIS 6의 경우 WMI/Metabase API를 호출하여 virt dirs를 만듭니다. IIS 7의 경우 Microsoft.Web.Administration이지만 IIS 7 시스템에서만 사용할 수있는 API가 훨씬 있습니다.

나이브 방법 :

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

니스, 그렇지? 하지만 Microsoft.Web.Administration DLL을로드하는 중 이전 시스템에서 충돌이 발생하지 않도록하려면 어떻게해야합니까? 또는 어셈블리를 처음로드했을 때로드 된 어셈블리입니까? 어셈블리를 호출하는 메서드를 처음 사용할 때?

CLR/.NET 사양에 의해 보장되는 결정 성이 없으면 테스트가 도움이되지 않을 것입니다.

본인은이 주제에 대한 귀하의 경험, 힌트 또는 솔루션을 정말로 기다리고 있습니다. 지금까지 웹에서 원격으로 사용할 수있는 것을 찾지 못했습니다.

답변

1

어셈블리가로드되어서는 안되며로드되어서는 안된다는 사양 에서처럼 확실한 답을 찾을 수 없었습니다. 그러나

http://msdn.microsoft.com/en-us/magazine/cc163655.aspx

(섹션 "로드 시작에서의 더 적은 모듈")

및 www.informit.com/articles/article.aspx?p=30601 & SEQNUM = 5 (추출물에서 북 추출물에 따라 "Essential .NET, Volume I : 공용 언어 런타임").

CLR의 JIT는 메서드를 컴파일하는 데 필요한 경우에만 필요한 어셈블리를로드합니다. 따라서 Microsoft.Web.Administration ...의 모든 사용을 어셈블리가 시스템에 있다고 확신 할 때 호출되는 별도의 메서드로 이동해야합니다. 그것은 오히려 JIT의 붙박이 동작에 의존하는 것보다, 내가 완전히 다른 어셈블리에 Microsoft.Web.Administration에 대한 종속성을 이동할 것, 개인적으로

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

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

입니다.

그런 다음 호출 어셈블리의 어딘가에서 %systemroot%\inetsrv\Microsoft.Web.Administration.dll이 있는지 확인합니다. 그렇다면 관리 인터페이스를 사용하고 어셈블리를 호출한다고 가정합니다. 그렇지 않다면 메타베이스 API로 되돌아갑니다.

관련 문제