2016-09-09 6 views
0

На компьютере с Windows Server 2012 файл MSI установил сборку ABCD.dll в GAC_32. Я пытаюсь исправить этот файл с WindowsPowerShell, со следующими командами:Установка и удаление сборок в GAC с помощью 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

Как упоминалось в данной области техники icle "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 на маркер открытого ключа сборки.