繁体   English   中英

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

[英]Installing and uninstalling assemblies in GAC with WindowsPowerShell

在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

如文章“ Microsoft Installer不会从GAC中删除程序集-全局程序集缓存针”一样 ,问题是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更改为程序集的公钥令牌。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM