CLR何时尝试加载引用的程序集?

时间:2009-12-22 08:58:50

标签: assemblies clr reference fusion

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

问题是:对于IIS 6,我们通过调用WMI / Metabase API创建virt目录,对于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规范保证某些确定性,测试就无济于事。

我真的很期待听到您对此主题的经验,提示或解决方案。到目前为止,我还没有在网上找到任何可以远程使用的东西。

2 个答案:

答案 0 :(得分:1)

我无法在规范中找到明确的答案,说明何时必须且不得加载程序集。但是,根据

http://msdn.microsoft.com/en-us/magazine/cc163655.aspx(“启动时加载少量模块”一节)

和本书摘录在www.informit.com/articles/article.aspx?p=30601&seqNum=5(摘自“Essential .NET,第I卷:公共语言运行时”)。

只有在需要编译方法时,CLR的JIT才会加载所需的程序集。因此,您应该将Microsoft.Web.Administration ...的任何使用移动到单独的方法,只有当您确信程序集存在于系统上时才会调用该方法。也就是说,

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

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

答案 1 :(得分:1)

就个人而言,我不是试图依赖JIT的任何内置行为,而是将Microsoft.Web.Administration的依赖性完全转移到另一个程序集。

然后,在调用程序集中的某个地方,我会检查是否存在%systemroot%\inetsrv\Microsoft.Web.Administration.dll。如果是这样,那么我假设我正在使用托管接口并调用程序集;如果没有,我将恢复为元数据库API。