【问题标题】:When does the CLR try to load a referenced assembly?CLR 何时尝试加载引用的程序集?
【发布时间】:2010-12-29 00:56:39
【问题描述】:

我想编写一个安装网站并创建 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 规范保证某些确定性,测试也无济于事。

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

【问题讨论】:

    标签: assemblies clr reference fusion


    【解决方案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 ....
       }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-05-09
        • 2011-02-07
        • 1970-01-01
        • 1970-01-01
        • 2011-02-07
        • 2023-03-02
        • 1970-01-01
        • 2020-10-09
        • 1970-01-01
        相关资源
        最近更新 更多