2009-12-22 69 views
4

我想编写一个安装网站并创建IIS虚拟目录的小型安装程序应用程序。该应用程序应该在Windows XP/Server 2003(IIS 6)以及Vista/2008(IIS 7)上运行。CLR何时尝试加载引用程序集?

问题是:对于IIS 6,我们通过调用WMI/Metabase API创建virt dirs,对于IIS 7,有一个更好的API:Microsoft.Web.Administration,但它的程序集仅在IIS 7系统上可用。

幼稚的做法:

... 
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,第一卷:通用语言运行时”)。

只有在需要编译方法时,CLR的JIT才会加载所需的程序集。因此,您应该将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。

相关问题