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

标签 assemblies clr reference fusion

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

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

最佳答案

我一直无法找到明确的答案,因为在规范中说明了何时必须和不得加载程序集。然而,根据

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 ....
   }

关于assemblies - CLR 何时尝试加载引用的程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1945057/

相关文章:

c# - 我有一个 c sharp dll。我怎样才能使它在其他语言(例如 PHP 或 Delphi)中可用?

.net - 如何编译CIL代码?

Java 方法与引用性能

javascript - 如何使用调用函数的元素的 "this"引用?

generics - 如何为涉及对中间局部变量的引用的闭包指定生命周期边界?

c++ - Web Assemblies WASM 新手

c# - 如何防止 .NET 应用程序从 GAC 加载/引用程序集?

c# - 从 RDP session 中的 SQL CLR 内部获取本地计算机名称或 IP 地址

c++ - 在 mida 保护下的 Dllmain 死锁

c# - CLR 如何知道装箱对象的类型?