2011-01-26 10 views
0

우리는 설치를 위해 사용자 정의 부스트 래퍼/외부 UI를 만들고 있습니다.설치하기 전에 기능 설치 비용을 받으십시오.

MSI와 같은 "사용자 지정 설치"대화 상자를 제공하여 사용자가 설치하거나 제거 할 기능을 선택할 수있게하려고합니다.

현재 우리는 Feature 테이블에서 SQL 쿼리를 실행하여 MSI 데이터베이스 자체에서 기능 및 설명과 같은 기타 기능 세부 정보를 읽을 수 있습니다.

그러나 기능 설치 비용도 표시하려고합니다. Windows Installer "사용자 지정 설치"대화 상자에서이 작업을 수행 할 수 있습니다.

나는 우리가 수행하여 동작을 모방 할 수 있다고 생각 다음

  1. 당신이 FeatureComponents 표를 사용하여 비용
  2. 를 얻을하려는 Feature을 선택, 1
  3. 에서 기능과 관련된 Component를 얻을 수
  4. File 테이블을 사용하여 2
  5. 에있는 구성 요소와 관련된 파일 중 FileSize을 추가하십시오. 3의 합계는 기능 설치비 012입니다 347,

질문 :

  1. 이 API는 거기에 우리가 설치하기 전에 기능의 비용을 얻을 수 있습니다 (중 DTF 또는 MSI.DLL에서)? DTF에는 FeatureInfo.GetCost 메서드가 있지만 직접 사용할 수는 없습니다. FeatureInfo.GetCostProductInstallation에서 호출하기 전에 먼저 제품을 설치해야합니다.
  2. API가없는 경우 위의 절차를 적절하게 계산하거나 올바르게 계산해야합니다 기능 설치 비용?

고마워요! :)

업데이트 # 1

내가 이전에도 설치를 시작하기 API를 통해 기능 설치 비용을 얻을 수있는 방법이 있다고 생각. 방법은 다음과 같습니다.

Installer.SetInternalUI(InstallUIOptions.Silent); 

Session s = Installer.OpenPackage(@"C:\a.msi", false); 

foreach (FeatureInfo info in s.Features) 
{ 
    MessageBox.Show(info.Name); 
    MessageBox.Show(info.GetCost(false, false, InstallState.Unknown).ToString()); 
} 
s.Close(); 

info.name은 기능의 이름을 성공적으로 반환합니다. 그러나 info.GetCost을 호출하면 "선택 관리자가 초기화되지 않았습니다"라는 메시지와 함께 InvalidHandlerException을 반환합니다.

여기 내가 현재있는 곳입니다.

업데이트 # 2 : 나는 info.GetCost를 호출하기 전에 내가 필요한 file costing routines를 호출하고 있지 않다 때문에

나는 InvalidHandlerException을 얻고 있었다.

Installer.SetInternalUI(InstallUIOptions.Silent); 

    Session s = Installer.OpenPackage(@"C:\1.msi", false); 
    s["ROOTDRIVE"] = @"C:\"; 
    s.DoAction("CostInitialize"); 
    s.DoAction("FileCost"); 
    s.DoAction("CostFinalize"); 

    foreach (FeatureInfo info in s.Features) 
    { 
     long cost = info.GetCost(false, false, InstallState.Local); 
     MessageBox.Show(info.Title + " " + cost); 
    } 
    s.Close(); 

나는 더 이상 InvalidHandlerException하지만 반환되는 모든 파일 비용이 -1099511627776입니다 무엇입니까 : 여기 내 수정 된 코드입니다.

답변

1

예, API가 있습니다. OpenPackage를 호출하여 MSI 세션을 가져와야합니다. 이렇게하면 GetCost 메서드에 액세스 할 수있는 기능 목록에 액세스 할 수 있습니다.

1 잡았다 : 당신은 비용을 계산하기 전에 4 개 표준 작업을 수행해야합니다 CostInitialize, FileCost, CostFinalizeInstallValidate합니다.

Installer.SetInternalUI(InstallUIOptions.Silent); 

    Session s = Installer.OpenPackage(@"C:\1.msi", false); 
    s.DoAction("CostInitialize"); 
    s.DoAction("FileCost"); 
    s.DoAction("CostFinalize"); 
    s.DoAction("InstallValidate"); 

    foreach (FeatureInfo info in s.Features) 
    { 
     long cost = info.GetCost(false, false, InstallState.Local); 
     MessageBox.Show(info.Title + " " + cost); 
    } 
    s.Close(); 
1

이 답변은 찾고자하는 것이 아니지만 작성시 기능 크기를 사전 계산하고 설치 중에 미리 계산 된 표를 사용하는 것이 좋습니다. 이것은 WiX v3.6의 Burn에서 우리가하는 것입니다. 많이 더 빠르고 많이 더 안정적입니다.

+0

이것은 정확히 우리가 한 일입니다. 크기 문제는 s.DoAction ("InstallValidate") 호출로 해결되었습니다. OpenPackage를 호출하면 실제로 시나리오에 따라 문제가되는 엔진 (MSIEXEC)이 실제로 "실행"되고 "대화 형으로"비용을 계산하는 데 시간이 걸리기 때문에 사전 계산이 가장 적합합니다. 제안 해 주셔서 감사합니다! :) – Ian