2017-03-29 1 views
1

병합 모듈에서 제공하는 CustomAction을 통해 속성을 설정할 때 특별한 처리가 필요합니까? 병합 모듈에서 나중에 사용할 세 가지 속성을 제공하는 두 개의 사용자 지정 동작이 있습니다. 그들은 보통의 C# 코드에 의해 설정됩니다값을 추가 한 후 빈 MSI 속성

session["APPSRVPORT"] = port.ToString(); 

MSI 로그는 속성 값으로 설정되어 있는지보고합니다

MSI (s) (C0!DC) [11:58:04:615]: PROPERTY CHANGE: Adding APPSRVPORT property. Its value is '11376'. 

는 구성 요소를 설치하기 위해 오는

는 다음 문을 설치하는 데 사용됩니다

01 :

<RegistryValue Name="AppSrvPort" Value="[APPSRVPORT]" Type="string" /> 

그러나, 로그 값이이 시점에서 비어있는 것을 보여준다 다음 MSI 속성을 사용하는 레지스트리 값 이상 가득

MSI (s) (C0:AC) [11:58:06:208]: Executing op: RegAddValue(Name=AppSrvPort,,) 

누구든지 해결 방법을 알려 줄 수 있습니까? 이미 실행 시퀀스가 ​​유효하다는 것을 확인했습니다 (즉, 속성을 "WriteRegistryValues"작업 전에 설정).

미리 감사드립니다.

+0

사용자 지정 작업이 즉각적이고 실제로 WriteRegistryValues ​​(로그의 위치가 아닌 테이블의 시퀀스 번호 별) 전에 예약되었는지 확인할 수 있습니까? (병합 모듈에서 guid 접미사가없는 비 내장 속성을 설정하는 것은 조금 이상합니다. 그러나 여기에서는 문제가 아닙니다.) –

답변

1

병합 모듈의 .wxs 스크립트에서 속성을 참조하면 모듈화 (즉, 병합 모듈 GUID가 추가됨)이됩니다. 그래서 <RegistryValue> 요소는 실제로 다음과 같이 해석됩니다 :

<RegistryValue Name="AppSrvPort" Value="[APPSRVPORT.YOUR_MERGE_MODULE_ID]" Type="string" /> 

YOUR_MERGE_MODULE_ID-가, _하여 전자를 대체 갖는 병합 모듈의 GUID 될 것입니다. 지. 1E35CFEB_7FA9_49F2_8E0D_5D941720EE81. 재산 또는 억제 모듈화를 작성할 때

이 문제를 해결하려면, 당신도 병합 모듈 ID를 추가 할 수있다.

병합 모듈 내에서만 속성을 사용하고 있으므로 동일한 이름을 가진 기본 MSI의 기존 속성을 실수로 덮어 쓰는 것을 방지해야합니다.

<Property Id="APPSRVPORT" SuppressModularization="yes"/> 

: 속성이 주요 MSI와 병합 모듈 사이에을 공유하기위한 것 경우

session["APPSRVPORT.YOUR_MERGE_MODULE_ID"] = port.ToString(); 

억제 모듈화가 유용 할 수 있습니다 다음 "네임 스페이스"로 병합 모듈 ID의 생각 참고 : 모듈화를 억제하면 CNDL1006 및 CNDL1086 경고가 발생합니다. 이는 수행중인 작업을 알고있는 경우 무시할 수 있습니다. ;-)

+0

그러나이 작업은 ** 병합 모듈 ** 내에서 ** 속성 참조에 적용됩니다. 너무? 이 속성은 동일한 병합 모듈에 정의되어 있고 병합 모듈과 MSI 자체간에 공유되지 않는 구성 요소에 의해 다시 사용됩니다. –

+0

@Marc 죄송합니다. 질문을 잘못 읽었지 만, 제가 쓴 내용은 여전히 ​​적용됩니다. ' '요소는 모듈화를 억제하지 않는 한 병합 모듈 ID가 추가 된 속성을 읽으려고 시도합니다.몇 가지 도구 (예 : [InstEd] (http://www.instedit.com/))를 사용하여 .MSM 파일을 열고 'Registry' 표를 보면 확인할 수 있습니다. – zett42

+0

@Marc 답변을 업데이트했습니다. – zett42

관련 문제