2016-09-09 2 views
0

Windows Server 2012 컴퓨터에서 msi 파일은 어셈블리 ABCD.dll을 GAC_32에 설치했습니다. 나는 다음과 같은 명령을,의 WindowsPowerShell이 ​​파일을 패치하려고 :WindowsPowerShell을 사용하여 GAC에서 어셈블리 설치 및 제거

[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, 버전 = 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" -l 

와 어셈블리의 목록을 얻을 때

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" -u ABCD.dll 

다음과 같은 메시지가

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

답변

0

artic le "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.

관련 문제