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