在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
答案 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必须更改为程序集的公钥标记。