4

我想编写一个安装网站并创建 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...
}
...

不错,不是吗?但是,如何确保在尝试加载 Microsoft.Web.Administration DLL 时不会在旧系统上崩溃?或者是刚加载的程序集,当它第一次使用时?何时首次使用调用程序集的方法?

我想,如果没有 CLR/.NET 规范保证某些确定性,测试也无济于事。

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

4

2 回答 2

1

就个人而言,与其试图依赖 JIT 的任何内置行为,我会将依赖Microsoft.Web.Administration完全移至另一个程序集。

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

于 2009-12-22T14:52:03.520 回答
1

我无法找到明确的答案,如说明何时必须加载和不得加载程序集的规范。然而,根据

http://msdn.microsoft.com/en-us/magazine/cc163655.aspx(“启动时加载更少的模块”部分)

以及 www.informit.com/articles/article.aspx?p=30601&seqNum=5 上的书摘录(摘自“Essential .NET, Volume I: The Common Language Runtime”)。

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

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

   void doIIS7Setup()
   {
     call Microsoft.Web.Administration ....
   }
于 2009-12-22T13:14:54.000 回答