将DLL拖放到Windows Server 2008 .net 4.0中的GAC(“程序集”)

时间:2011-10-16 21:55:03

标签: .net .net-4.0 gac

我正在尝试将一些代码部署到客户端计算机,我不想安装MS Windows SDK工具。这意味着无法访问“gacutil”。我还没有为我的代码创建安装程序。看起来这些可能是.net 4.0中唯一的两个选项。

在过去,我只需要开始,运行,键入“程序集”,然后拖放我的dll。

这不再可能吗?当我尝试这样做时,我没有收到任何错误消息,但dll没有出现在“assembly”文件夹中。当我在我的开发机器上使用gacutil时它可以正常工作,但dll仍然没有出现。

7 个答案:

答案 0 :(得分:53)

在.net 4.0中,Microsoft删除了仅通过拖放将DLL添加到程序集的功能。

相反,您需要使用gacutil.exe,或创建安装程序来执行此操作。微软实际上不建议使用gacutil,但无论如何我都去了那条路线。

要在开发机器上使用gacutil,请访问:
Start -> programs -> Microsoft Visual studio 2010 -> Visual Studio Tools -> Visual Studio Command Prompt (2010)

然后分别使用这些命令卸载和重新安装。注意我在卸载命令中没有包含.dll gacutil /u myDLL
gacutil /i "C:\Program Files\Custom\myDLL.dll"

要在非开发计算机上使用Gacutil,您必须将可执行文件和配置文件从开发计算机复制到生产计算机。看起来有几个不同版本的Gacutil。那个对我有用的人,我在这里找到了:
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\gacutil.exe C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\gacutil.exe.config

将文件复制到相应的.net文件夹中;
C:\Windows\Microsoft.NET\Framework\v4.0.30319

然后使用这些命令分别卸载和重新安装 "C:\Users\BHJeremy\Desktop\Installing to the Gac in .net 4.0\gacutil.exe" /u "myDLL"

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\gacutil.exe" /i "C:\Program Files\Custom\myDLL.dll"

答案 1 :(得分:21)

在可能的情况下,我需要复制gacutil.exe,gacutil.exe.config以及gacutil.dll(来自1033目录)

答案 2 :(得分:4)

gacutil实用程序在客户端计算机上不可用,Window SDK许可证禁止将其重新分发给客户。当您的客户不能,(并且实际上不应该)下载300MB Windows SDK作为应用程序安装过程的一部分。

您(或您的安装程序)可以使用官方支持的API在全局程序集缓存中注册程序集。 Microsoft的Windows Installer技术知道如何为您调用此API。您必须咨询您的MSI安装程序实用程序(例如WiX,InnoSetup),了解如何表明您希望在全局程序集缓存中注册程序集的语法。

但MSI和gacutil没有什么特别之处。他们只需调用您可以自己调用的相同API。有关如何通过代码注册程序集的文档,请参阅:

  

KB317540: DOC: Global Assembly Cache (GAC) APIs Are Not Documented in the .NET Framework Software Development Kit (SDK) Documentation

var IAssemblyCache assemblyCache;
CreateAssemblyCache(ref assemblyCache, 0);


String manifestPath = "D:\Program Files\Contoso\Frobber\Grob.dll";

FUSION_INSTALL_REFERENCE refData;
refData.cbSize = SizeOf(refData); //The size of the structure in bytes
refData.dwFlags = 0; //Reserved, must be zero
refData.guidScheme = FUSION_REFCOUNT_FILEPATH_GUID; //The assembly is referenced by an application that is represented by a file in the file system. The szIdentifier field is the path to this file.
refData.szIdentifier = "D:\Program Files\Contoso\Frobber\SuperGrob.exe"; //A unique string that identifies the application that installed the assembly
refData.szNonCannonicalData = "Super cool grobber 9000"; //A string that is only understood by the entity that adds the reference. The GAC only stores this string

//Add a new assembly to the GAC. 
//The assembly must be persisted in the file system and is copied to the GAC.
assemblyCache.InstallAssembly(
      IASSEMBLYCACHE_INSTALL_FLAG_FORCE_REFRESH, //The files of an existing assembly are overwritten regardless of their version number
      manifestPath, //A string pointing to the dynamic-linked library (DLL) that contains the assembly manifest. Other assembly files must reside in the same directory as the DLL that contains the assembly manifest.
      refData);

删除知识库文章之前的更多文档:

  

结构的字段定义如下:

     
      
  • cbSize - 结构的大小(以字节为单位)。
  •   
  • dwFlags - 保留,必须为零。
  •   
  • guidScheme - 添加引用的实体。
  •   
  • szIdentifier - 标识安装程序集的应用程序的唯一字符串。
  •   
  • szNonCannonicalData - 只有添加引用的实体才能理解的字符串。 GAC仅存储此字符串。
  •   
     

guidScheme字段的可能值可以是以下之一:

     

FUSION_REFCOUNT_MSI_GUID - 使用 Windows Installer 安装的应用程序引用程序集。 szIdentifier 字段设置为 MSI szNonCannonicalData 设置为Windows Installer。此方案只能由Windows Installer本身使用。    FUSION_REFCOUNT_UNINSTALL_SUBKEY_GUID - 程序集由添加/删除程序中显示的应用程序引用。 szIdentifier 字段是用于通过添加/删除程序注册应用程序的标记。    FUSION_REFCOUNT_FILEPATH_GUID - 程序集由文件系统中的文件表示的应用程序引用。 szIdentifier 字段是此文件的路径。       FUSION_REFCOUNT_OPAQUE_STRING_GUID - 程序集由仅由不透明字符串表示的应用程序引用。 szIdentifier是这个不透明的字符串。当您删除它时,GAC不会对不透明引用执行存在性检查。

答案 3 :(得分:3)

如果您安装了必要的.net框架。 Ex; .Net 4.0.Net 3.5,您只需将Gacutil.exe从任何计算机复制到新计算机即可。

1)在新服务器中以管理员身份打开CMD 2)遍历到您复制Gacutil.exe的文件夹。例如 - C:\ program files。(在我的情况下)。
3)在cmd提示符下键入以下内容并安装。

  

C:\ Program Files \ gacutil.exe / I dllname

答案 4 :(得分:2)

安装程序和gacutil的其他替代方法是GUI工具,如Gac ManagerGACAdmin。或者,如果你喜欢PowerShell,你可以使用我PowerShell GAC作为作者。

答案 5 :(得分:1)

请注意,Fusion API不受管理。目前的参考资料如下:Development Guide > Unmanaged API Reference > Fusion

但是,有一种托管方法可以将程序集添加到GAC: System.EnterpriseServices.Internal.Publish.GacInstall 而且,如果您需要注册任何类型: System.EnterpriseServices.Internal.Publish.RegisterAssembly

发布类的引用位于:.NET Framework Class Library > System.EnterpriseServices Namespaces > System.EnterpriseServices.Internal

但是,这些方法旨在安装Web服务应用程序(如ASP.NET或WCF)所需的组件。因此,他们不会使用Fusion注册组件;因此,它们可以被其他应用程序卸载,或者使用gacutil,导致程序集停止工作。因此,如果您在管理员管理GAC的Web服务器之外使用它们,请确保在SOFTWARE \ Wow6432Node \ Microsoft \ Fusion \ References(适用于64位操作系统)或SOFTWARE \ Microsoft \中添加对应用程序的引用Fusion \ References(适用于32位操作系统),以便除非他们卸载您的应用程序,否则任何人都无法删除您的支持程序集。

答案 6 :(得分:-2)

您也可以使用命令提示符将文件复制到GAC。我使用以下批处理脚本来复制DLL并重新启动IIS。

copy /b/v/y "PathToAssembly\MyAssembly.dll" "C:\Windows\assembly\" 
iisreset /noforce
pause

节省使用或安装gacutil的需要