如何从服务器 GAC 中删除 .NET 程序集 DLL

How to remove .NET assembly DLLs from server GAC

我正在尝试将包含 Oracle ODP.NET 库的 VS2013 项目部署到 Windows 2008 IIS 服务器,并收到一个错误 "Could not load type 'OracleInternal.Common.ConfigBaseClass' from assembly 'Oracle.ManagedDataAccess, Version=4.121.2.0.'" 根据我在网上找到的内容这是由于项目的ODP和GAC中有ODP的服务器冲突造成的。然后指示从 GAC 中删除 ODP。服务器上的 GAC 中有 Oracle DLL。我们 99% 确定 DLL 在 GAC 中结束是因为之前尝试在该机器上设置 Oracle,因为该服务器上的其他项目不应该使用 Oracle。所以我们应该安全地将其从 GAC 中删除。

但是,gacutil.exe 仅在 Visual Studio 中可用,我们不允许将 Visual Studio 安装到服务器上。

那么我们如何在服务器上 gacutil.exe 不可用的情况下从 GAC 卸载 Oracle DLL?我们可以从目录中删除它们吗?或者我们是否需要将 gacutil.exe 从我的工作站复制到服务器才能执行此操作?还是有另一种方法? (最好不涉及注册表编辑)

如有任何建议,谢谢。

如果您有管理员权限,您应该可以使用 Windows 界面执行此操作,如下所示。

  1. 导航到位于 %systemdrive%\Windows\Assembly 的 GAC。

  2. 右键单击应用程序中包含的每个程序集文件,单击“卸载”,然后单击“是”进行确认

如果您无法通过上述方法卸载 dll,您可以通过打开 运行 命令并输入下面的路径并按回车键访问 GAC 文件夹而无需特殊视图。

C:\Windows\assembly\GAC_MSIL

这将允许您像普通文件夹一样与 GAC 中的所有文件进行交互。

如果您有 Visual Studio,则可以在任何地方将 gacutil 从其位置移植到服务器上。在我的电脑上,Visual Studio 2015 年是 C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools。关于 SO 的另一个问题,它说您也可以单独安装 Microsoft SDK(我假设它应该安装在那里,或者如果它是不同的版本,则安装在不同的“v”文件夹中)。如果你知道它应该在特定的计算机上,你可以执行 where gacutil 找到它,然后将它和它旁边的 gacutil.exe.config 文件复制到服务器。 ( where is gacutil.exe? )

有时,当您尝试使用 gacutil 从 GAC 中删除 Oracle.ManagedDataAccess 时,您会收到错误消息,即 Windows 安装程序是一个依赖项( Unable to uninstall an Assembly from GAC? ). If so, you have to also remove it from HKEY_CURRENT_USER\Software\Microsoft\Installer\Assemblies\Gl‌​obal & HKEY_LOCAL_MACHINE\Software\Classes\Installer\Assemblies\Glo‌​bal, then do the gacutil -u command. I had this issue and I didn't have to go to the HKCU location-but it was at the HKLM location. After removing it from there, I uninstalled & re-installed the Oracle Developer Tools for Visual Studio, just to be safe (I saw it said to do so here: https://community.oracle.com/thread/3944905), 然后我的项目终于成功了。

注意:当我尝试转到 C:\Windows\assembly\GAC_MSIL 时,我什至没有看到 Oracle.ManagedDataAccess,所以我无法那样删除它。我发布这篇文章是为了帮助任何可能 运行 进入具有相同问题的顽固 DLL 的人。