如何引用 Microsoft.Web.Administration?
Posted
技术标签:
【中文标题】如何引用 Microsoft.Web.Administration?【英文标题】:How to reference Microsoft.Web.Administration? 【发布时间】:2013-08-07 13:04:55 【问题描述】:Microsoft.Web.Administration 程序集位于我机器上的C:\Windows\System32\inetsrv
中。我相信它是作为 IIS 的一部分安装的。该程序集也在 GAC 中。
鉴于我想将项目提交到 SVN 以供其他人签出,我应该如何从我的项目中引用此程序集。 Microsoft.Web.Administration
不会出现在 Visual Studio 的“添加引用”列表中。我可以添加对C:\Windows\System32\inetsrv\Microsoft.Web.Administration
的引用,但这似乎是个坏主意,因为其他开发人员可能会将其安装在不同的路径或驱动器上。
或者我可以将它复制到项目文件夹中,但是我必须将二进制文件提交到 SVN。
【问题讨论】:
将 dll 添加到 svn 以便其他人可以查看并在项目中使用。您还应该考虑将其添加到设置中。 我会坚持使用 GAC 参考。 @tnw 那么你需要开启 IIS 功能。 @Reniuz 那里存在潜在的法律问题。所有开发人员都应该具有所需的设置,以便相关的 DLL 在 GAC 中(即他们的开发机器被配置为开发他们的东西!)当涉及到客户端时,一种不同的、通常更合法的方法是引导用所需的 DLL 配置机器的东西,而不是“绑架”DLL。 @GrantThomas 你说的是真的。但是安装IIS是因为dll的原因……需要多了解一下这个东西。最近我不得不使用这个 dll,因为我可以通过编程方式添加站点绑定,以便使用证书的 web 服务工作。我将不胜感激有关“绑架” dll 的任何参考。 :) 【参考方案1】:以下步骤对我有用:
-
转到
C:\Windows\System32\inetsrv
并检查文件Microsoft.Web.Administration.dll
是否存在。如果您在 C:\Windows\System32\inetsrv
中缺少 Microsoft.Web.Administration.dll
,请在您的 Windows 功能中启用 IIS 管理控制台:
-
在您的 Visual Studio 项目中,添加对
Microsoft.Web.Administration.dll
的引用:
现在您的 .proj 文件具有以下条目:<HintPath>C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll</HintPath>
。您可以将此路径调整为例如<HintPath>%windir%\System32\inetsrv\Microsoft.Web.Administration.dll</HintPath>
使其更加健壮。
当您将应用移至其他系统时,该应用还会引用目标系统上的Microsoft.Web.Administration.dll
。由于 Microsoft.Web.Administration.dll
在 Windows 系统之间可能不同,因此不建议应用程序提供此程序集文件的副本。 副本可能与目标系统上的 IIS 不兼容。
也不建议在同一系统上引用程序集的副本,因为Microsoft.Web.Administrator.dll
和 IIS 可能会因 Windows 更新而改变!那么您引用的 Microsoft.Web.Administrator.dll
副本与更新后的 IIS 不兼容。
当目标系统上缺少 Microsoft.Web.Administrator.dll 时,请按照上述步骤 1 中的说明激活管理控制台。或者,您可以使用 cmd(以管理员身份打开)并通过以下命令通过 DISM.exe
激活 Windows 功能管理控制台:
C:\Windows\System32\Dism.exe /enable-feature /online /featurename:IIS-ManagementConsole
当您想通过设置分发应用时,此命令可能很有用。
【讨论】:
这不是推荐的方法,因此一旦您移动到具有不同 IIS 版本的另一台 Windows 计算机,可能会出现程序集不匹配。您只需将提示路径留在项目文件中,以便 Visual Studio 或 MSBuild 解析 IIS 安装文件夹中的程序集。 @Lex Li:我完全同意。我已经调整了我的答案。感谢您的贡献。【参考方案2】:您可以手动修改您的项目文件。添加/更改如下引用将在 GAC 中找到程序集,无论其位置如何:
<Reference Include="Microsoft.Web.Administration, Version=7.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
当然,如果仅安装了“IIS 管理控制台”功能。您可以简单地在代码中留下提示:
#warning Windows feature "IIS management console" must be installed locally
【讨论】:
虽然这可能不是每个人的答案,但这正是我所需要的。人们需要知道这个程序集有两个版本,一个用于 IIS,一个用于 IIS Express。可通过 NuGet 获得的版本适用于 IIS,因此如果您确实想要 IIS Express 版本,那将无法正常工作。如果这样做,通过 NuGet 添加它可能是更明智的途径。 @DerekGreer,NuGet 包也是错误的做法,blog.lextudio.com/2015/05/… @LexLi 看起来 MS 现在拥有 MWA NuGet 包,所以它可能不再那么错误了。 @TLS 他们对基于 .NET Core 的新 REST API 进行了更改。不是你仍然使用 NuGet 包的标志。【参考方案3】:在 NuGet 中搜索并安装它。它将安装在包文件夹中,根据您的项目结构更改位置并重新添加引用以反映新路径。通常我会创建一个 lib 文件夹并放置所有外部库。
项目的文件夹结构可以是
lib -> external libraries
src - > code
tools -> tools such as nant, etc
Microsoft.Web.Administration
用于以编程方式管理 IIS,在添加引用窗口中不可用。通过从 C:\Windows\System32\inetsrv 添加引用会产生引用问题。因此,最好将它放在项目内部的 lib 文件夹中并在 SVN 中检查它。
【讨论】:
+1 我很高兴将程序集添加到 NuGet 中......现在只要他们也添加“Microsoft.Web.Management”(啊,为什么不是所有晦涩的 dll?) @dyslexicanaboko,通过 NuGet 打包是错误的,blog.lextudio.com/2015/05/… @LexLi 看起来 MS 现在拥有 MWA NuGet 包,所以它可能不再那么错误了。 @TLS 我将在收到 Microsoft 的确认后更新博文。【参考方案4】:-
如果您是项目文件,请将提示路径更改为
<HintPath>%windir%\System32\inetsrv\Microsoft.Web.Administration.dll</HintPath>
。
登记入住。
然后,如果安装了 IIS,任何签出的人都应该看到正确的参考。如果未安装 IIS,则会出现需要解决的参考错误。
如@DzmitryLahoda 指出的那样,他们要么通过控制面板中的程序或通过命令行安装 IIS。
同样,任何指向 NuGet 包的技巧都是不恰当的,
https://blog.lextudio.com/2015/05/whats-microsoft-web-administration-and-the-horrible-facts-you-should-know/
【讨论】:
这是正确的。如果您使用 NuGet 包,那么您将在未经 Microsoft 许可的情况下重新分发程序集(假设您将其打包到您的部署中)。 @Bringer128 看起来 MS 现在拥有 MWA NuGet 包,所以它可能不再那么错误了。 @TLS Microsoft 为其 IIS 10 REST API 托管了一个 .NET Core 兼容包,但这仍然不针对其他场景。【参考方案5】:C:\Windows\System32\inetsrv
或
C:\Windows\winsxs\x86_microsoft.web.administration-nonmsil_31bf3856ad364e35_6.1.7600.16385_none_c8472944f22a9c81
C:\Windows\WinSxS\x86_microsoft.web.administration-nonmsil_31bf3856ad364e35_6.3.9600.16384_none_5d1097a8ac709c4e
【讨论】:
不是每个人都将 Windows 安装到 C 盘。【参考方案6】:使用 Nuget:
Microsoft.Web.Administration
【讨论】:
这个明显的解决方案有什么问题,它有 -1 票?有人愿意详细说明吗? 众所周知,Microsoft.Web.Administration 包的实施非常糟糕,而且弊大于利。 Lex Li 在his answer 的博文讲述了为什么人们永远不想使用该软件包。 TL;DR:MWA 只是 IIS COM 接口的包装器,并且会随着每个版本的 IIS 发生变化。 NuGet 包专为 IIS.Administration 中的内部使用而设计。【参考方案7】:尝试确保通过预构建事件安装这些程序集:
Dism /online /Enable-Feature /FeatureName:IIS-WebServerManagementTools /All
以这种方式安装了具有所有功能的整个 IIS,因此使用 FeatureName
是对程序集的猜测。尝试下一步列出所有替代功能:
dism /online /Get-Features
DISM
适用于早于 8 的 Windows:
To service inbox drivers in an offline image of Windows Vista with Service Pack 2 (SP2) or Windows Server 2008 with SP2, you must use the Windows 7 version of DISM or PkgMgr. The Windows 7 version of DISM is available in Windows 7 and Windows PE 3.0 operating systems, or can be installed with the Windows Automated Installation Kit (Windows AIK) or the Windows OEM Preinstallation Kit (Windows OPK) for Windows 7.
也可以尝试 Windows 7 及以下版本:
start /w pkgmgr /iu:IIS-WebServerManagementTools
【讨论】:
很遗憾这只适用于Windows 8及以上,technet.microsoft.com/en-us/library/hh825236.aspx对于IIS 7和7.5,用户需要使用遗留方式。【参考方案8】:一些额外的信息,不是直接的答案。 IIS 和 IIS Express 使用同一个 DLL 的两个不同版本,因此您的应用程序可能会意外获取错误的版本。见http://rdingwall.com/2013/09/22/microsoft-web-administration-confusion/
【讨论】:
【参考方案9】:您总是可以只动态加载 dll,而永远不要在您的项目中直接引用它。这样您就可以避免所有“引用”问题、NuGet 包等。但是,您仍然需要验证 dll 在最终目标上是否可用。
var windowsPath = Environment.GetFolderPath(Environment.SpecialFolder.Windows);
var DLL = Assembly.LoadFile($@"windowsPath\System32\inetsrv\Microsoft.Web.Administration.dll");
if (DLL != null)
// Get Server...
foreach (Type type in DLL.GetExportedTypes())
if (type.Name == "ServerManager")
dynamic server = Activator.CreateInstance(type);
dynamic applicationPools = server.ApplicationPools;
foreach (dynamic pool in applicationPools)
MessageBox.Show(pool.Name);
// Done -- Get Out...
break;
【讨论】:
【参考方案10】:执行此操作的最简单方法是从此链接在 Visual Studio 中安装 NuGet。 http://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc9970c
然后,在 Visual Studio 中,转到工具->NuGet 包管理器-> 包管理器控制台
然后,选择默认项目作为您要安装到的项目。
最后,运行 Install-Package Microsoft.Web.Administration 命令。
【讨论】:
我投了反对票,因为这个答案与 3 个月前发布的当前投票最高的答案相同。唯一添加的是安装 NuGet 的“指南”,恕我直言,这与问题无关。 我是新手,投票率最高的问题并没有帮助我理解如何遵循整个过程。我确实花了一些时间在它上面,所以我想我应该发布它并帮助其他人。但我不介意投反对票,我会记住这一点。 :) 谢谢 NuGet 包并非来自微软,与官方指南blog.lextudio.com/2015/05/… 相违背 Lex Li.. 谢谢你的评论,但我在哪里说 NuGet 包来自微软? @thestar 更重要的是,NuGet 包没有许可信息,并且程序集由 Microsoft 制作,而 NuGet 包没有。从法律上讲,在 Microsoft 发布该程序集的许可信息之前,您无权重新分发该程序集。【参考方案11】:将名为“引用程序集”的新项目添加到您的解决方案中,并将 DLL 添加到该项目中 - 这样 DLL 将位于源代码管理中。然后,您可以使用添加引用中的“浏览”选项来引用该项目。
您的同事会很高兴,因为他们不会错过这个 DLL,因为它在源代码控制中。
【讨论】:
SVN 不在乎它是否在解决方案中。以上是关于如何引用 Microsoft.Web.Administration?的主要内容,如果未能解决你的问题,请参考以下文章