우리는 설치를 위해 사용자 정의 부스트 래퍼/외부 UI를 만들고 있습니다.설치하기 전에 기능 설치 비용을 받으십시오.
MSI와 같은 "사용자 지정 설치"대화 상자를 제공하여 사용자가 설치하거나 제거 할 기능을 선택할 수있게하려고합니다.
현재 우리는 Feature
테이블에서 SQL 쿼리를 실행하여 MSI 데이터베이스 자체에서 기능 및 설명과 같은 기타 기능 세부 정보를 읽을 수 있습니다.
그러나 기능 설치 비용도 표시하려고합니다. Windows Installer "사용자 지정 설치"대화 상자에서이 작업을 수행 할 수 있습니다.
나는 우리가 수행하여 동작을 모방 할 수 있다고 생각 다음
- 당신이
FeatureComponents
표를 사용하여 비용 - 를 얻을하려는
Feature
을 선택, 1 에서 기능과 관련된
File
테이블을 사용하여 2- 에있는 구성 요소와 관련된 파일 중
FileSize
을 추가하십시오. 3의 합계는 기능 설치비 012입니다 347,
Component
를 얻을 수
질문 :
- 이 API는 거기에 우리가 설치하기 전에 기능의 비용을 얻을 수 있습니다 (중 DTF 또는 MSI.DLL에서)? DTF에는
FeatureInfo.GetCost
메서드가 있지만 직접 사용할 수는 없습니다.FeatureInfo.GetCost
을ProductInstallation
에서 호출하기 전에 먼저 제품을 설치해야합니다. 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입니다 무엇입니까 : 여기 내 수정 된 코드입니다.
이것은 정확히 우리가 한 일입니다. 크기 문제는 s.DoAction ("InstallValidate") 호출로 해결되었습니다. OpenPackage를 호출하면 실제로 시나리오에 따라 문제가되는 엔진 (MSIEXEC)이 실제로 "실행"되고 "대화 형으로"비용을 계산하는 데 시간이 걸리기 때문에 사전 계산이 가장 적합합니다. 제안 해 주셔서 감사합니다! :) – Ian