2014-01-20 2 views
1
이해하기 위해 노력하고있어

는/설명 왜 일어나고 다음이해 참조 카운팅 - 윈도우 설치

1) A.msi 푸에게

2) B를 \하는 디렉토리 \ 경로 \를 생성 MSI는 레지스트리를 사용하여 foo는 \에 \ 경로 \를 발견하고 새로운 버전의 경우) B.msi가 제거 될 경우, 그것은 추가하는 추가 파일이

4

을 제거) 해당 위치

3에 몇 가지 더 많은 파일을 추가합니다 B.msi가 제거되기 전에 A.msi가 설치됩니다 (주요 업그레이드). 이후의 제거 B.msi는 \ path \에 추가 된 파일을 \ foo에 남겨 둡니다. msiexec/x 로깅은 다음과 같습니다.

(SERVER)  MSI (s) (60:08) [14:09:33:018]: Disallowing uninstallation of component: 
{BIFF} since another client exists 

(SERVER)  MSI (s) (60:08) [14:09:33:019]: Disallowing uninstallation of component: 
{BAM} since another client exists 

(SERVER)  MSI (s) (60:08) [14:09:33:019]: Disallowing uninstallation of component: 
{HARVEY} since another client exists 

(SERVER)  MSI (s) (60:08) [14:09:33:019]: Disallowing uninstallation of component: 
{ETC} since another client exists 

그래서 분명히 참조 카운트가 맞습니까? 하지만 내가 이해하는 방식이 아닙니다. 각 파일은 개별적으로 구성 요소로 랩핑되고 구성 요소 GUID는 고유하므로 두 MSI 간의 참조 계산이 유사하게 개별/고유하게 유지 될 것이라고 생각했을 것입니다.

디렉토리의 소유권과 관련하여 마지막 설치 관리자가이긴 경우이며 디렉토리의 소유권이 계산되는 구성 요소에 의해 래핑 된 파일의 참조 계산/제거와 반드시 간섭해야합니까? 누구든지이 주제에 대해 나와 공유 할 수있는 링크/문서가 있습니까?

+0

나는 보통에서 패키지에이 메시지가 우리의 클라이언트는 동일한 구성 요소 GUID가있을 때만 해당됩니다. A.msi를 빌드하고 B.msi를 다시 빌드하는 데 사용 된 프로젝트 파일을 복사하지 않았다고 가정합니다. (이로 인해 구성 요소 GUID가 중복 될 수 있음) –

+0

정확함. GUID는 A와 B의 구성 요소간에 고유합니다. 공유되는 유일한 것은 B가 속성으로 설정하는 디렉토리이며 A가 쓰는 레지스트리 항목에서 읽습니다. – NickHansen

답변

0

"공유"라는 두 가지 개념이 있습니다.

  1. 공유 구성 요소의 경우 두 구성 요소가 동일한 GUID를 사용하는 경우 발생합니다.

  2. 공유 DLL의 경우 구성 요소에 sharedDllRefCount 특성 집합이 있거나 파일이 이미있는 경우 이러한 현상이 발생합니다.

두 경우 모두에없는 폴더가 공유되어 있는지 생각하지만, 파일 (또는 어떤 자원이 구성 요소의 배치)

한 경우와 2 혼합, 때때로, 제거에서 제거되지 않은 파일된다 당신은 내가이를 제외하고 많이 찾을 수 없습니다 수동으로 당신이 질문 한 공식 문서에 대한 파일 또는 correct the sharedDLL counter manually

을 제거해야합니다 : http://msdn.microsoft.com/en-us/library/ms709304%28v=vs.85%29.aspx

+0

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer \ UserData \ ... 파일을 참조 할 수있는 다른 위치가 있습니다. - http://www.daviddeley.com/solutions/msiexec를 참조하십시오. /index.htm – pi3