使用WindowsPowerShell在GAC中安装和卸载程序集

时间:2016-09-09 07:56:03

标签: .net windows powershell .net-assembly

在Windows Server 2012计算机上,msi文件已将程序集ABCD.dll安装到GAC_32中。我尝试使用WindowsPowerShell使用以下命令修补此文件:

[System.Reflection.Assembly]::Load("System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")            
$publish = New-Object System.EnterpriseServices.Internal.Publish            
$publish.GacRemove("C:\Windows\Microsoft.NET\assembly\GAC_32\ABCD\v4.0_1.0.0.0__8a93b7fd09f0e7e7\ABCD.dll")      
$publish.GacInstall("C:\Patch1\ABCD.dll")

然而,GacRemove命令失败。在Windows事件日志/应用程序中,我收到以下消息:

从全局程序集缓存中删除程序集失败:C:\ Windows \ Microsoft.NET \ assembly \ GAC_32 \ ABCD \ v4.0_1.0.0.0__8a93b7fd09f0e7e7 \ ABCD.dll ABCD,Version = 1.0.0.0

有人有想法,可能是什么原因?

我也尝试了32位(C:\ Windows \ SysWOW64 \ WindowsPowerShell \ v1.0 \ powershell.exe)以及64位(C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe) )WindowsPowershell处于管理员模式。

gacutil也不起作用。我尝试以下方法:

"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools\gacutil" -u ABCD.dll

并收到以下消息:

Microsoft (R) .NET Global Assembly Cache Utility.  Version 4.0.30319.1
Copyright (c) Microsoft Corporation.  All rights reserved.
No assemblies found matching: ABCD.dll
Number of assemblies uninstalled = 0
Number of failures = 0

然而,当我使用

获取程序集列表时
"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools\gacutil" -l

我看到以下一行:

ABCD, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8a93b7fd09f0e7e7, processorArchitecture=x86

1 个答案:

答案 0 :(得分:0)

正如文章"Microsoft Installer does not remove assemblies from the GAC - Global Assembly Cache Pin"中所提到的,问题是HKEY_CLASSES_ROOT \ Installer \ Assemblies \ Global \ [程序集全名]中的注册表项具有一个值,该值是在msi安装程序集时设置的。因此,要修补程序集,必须清除注册表值,必须卸载程序集,必须安装修补程序集,并且必须将注册表值设置为旧值。注册表值可以保留为空,但是在卸载msi时,不会删除注册表项。因此,最好将注册表值再次设置为旧值。我终于编写了以下VB.NET代码来修补程序集:

        Dim subkey = My.Computer.Registry.ClassesRoot.OpenSubKey("Installer\Assemblies\Global", True)
        Dim keyname = "ABCD,Version=""1.0.0.0"",Culture=""neutral"",ProcessorArchitecture=""MSIL"",PublicKeyToken=""8A93B7FD09F0E7E7"""
        Dim values As String() = subkey.GetValue(keyname)
        subkey.SetValue(keyname, {""})
        Dim assemblyname =
            "C:\Windows\Microsoft.NET\assembly\GAC_32\ABCD\v4.0_1.0.0.0__8a93b7fd09f0e7e7\ABCD.dll"
        Dim p = New System.EnterpriseServices.Internal.Publish()
        p.GacRemove(assemblyname)
        p.GacInstall("D:\Patch1\ABCD.dll")
        subkey.SetValue(keyname, values)

在上面的代码中,ABCD必须更改为正确的程序集名称,并且8a93b7fd09f0e7e7必须更改为程序集的公钥标记。