2009-09-27 5 views
3

InstallShield MSI 프로젝트가 있습니다. InstallScript 사용자 지정 작업의 MSIHANDLE을 DotNetCoCreateObject()를 통해 초기화 된 관리되는 어셈블리에 전달하면 관리되는 코드 내에서받은 값은 -2가됩니다.MSI 로그 디버그 로그 싱크

DotNetCoCreateObject()를 통해 관리 코드를 호출하는 InstallScript 사용자 지정 작업에서 MSIHANDLE에 액세스 할 수 있는지 알 수 있습니까? 사용자 지정 작업 결과를 나머지 설치와 동일한 로그 파일에 기록하고 싶습니다. InstallShield 2010, Windows Install 4.5 및 .Net 3.5를 사용하고 있습니다.

답변

4

관리되는 사용자 지정 작업을 통해서만 가능하며 InstallShield의 InstallShield.Interop.Msi.dll을 사용하여 실제 핸들을 가져와야합니다.

using (Msi.Install msi = Msi.CustomActionHandle(_msiHandle)) 
{ 
    using (Msi.Record record = new Msi.Record(100)) 
    { 
     record.SetString(0, "LOG: [1]"); 
     record.SetString(1, entry.Message); 
     msi.ProcessMessage(Msi.InstallMessage.Info, record); 
    } 
} 

참고 : IS2010의로은 InstallShield.Interop.Msi.dll 디지털 서명되지 않으므로 어셈블리가 관리되는 사용자 지정 작업에서 MSI 로그 파일에 쓸 수

이 작동 관리되는 사용자 지정 동작도 함께 서명해야합니다.

+0

명심해야 할 것은 CustomAction이 컨트롤 이벤트의 DoAction에서 호출되지 않은 경우에만 작동한다는 것입니다. 이 방법을 사용하여 로그에 메시지를 작성하는 사용자 지정 작업이 있습니다. 이를 테스트하기 위해 UI의 단추 누르기와 InstallExecuteSequence의 동작으로 동작을 첨부했습니다. UI에 첨부 된 작업은 명령문을 기록하지 않았지만 동일한 작업이 ExecuteSequence의 일부로 실행되면 로그에 기록했습니다. – ksun

+0

명백하게 이것은 MsiProcessMessage가 DoAction 컨트롤 이벤트에서 작동하지 않기 때문입니다. 이 문제를 해결할 수있는 방법은 로그하려는 메시지가있는 속성을 설정하는 것입니다. – ksun

+0

위의 코드를 추가 한 후 MSI 로그에서 오류가 발생했습니다. ----- 호출 대상에 의해 예외가 발생했습니다. ---> System.IO.FileNotFoundException : 파일 또는 어셈블리 'InstallShield.Interop.Msi, 버전 = 23.0.0.511, Culture = neutral, PublicKeyToken = null'또는 해당 종속성 중 하나를로드 할 수 없습니다. 시스템이 지정된 파일을 찾을 수 없습니다. ---- 내 프로젝트에이 DLL을 추가했는데 출력 디렉토리에서 볼 수 있지만 설치 프로그램에 InstallShield.Interop.Msi dll을로드하는 방법은 무엇입니까? – Santhosh

0

아니요, 불가능합니다. 로그 출력을 직접 관리해야합니다.

0

IS에 두 가지 프로젝트 유형 인 InstallScript & MSI가 있습니다. MSI 프로젝트 내의 MSI 핸들에만 액세스 할 수 있습니다.

관련 문제