문제

MSI 파일 내부의 속성을 읽는 방법이 있습니까?

예를 들어 MSI 파일 이름 TestPackage.msi가 주어졌습니다

찾아야합니다

productName
PackageCode
version

이것은 wmi uncintall과 함께 사용할 것입니다.

string objPath = string.Format("Win32_Product.IdentifyingNumber='{0}',Name='{1}',Version='{2}'", "{AC9C1263-2BA8-4863-BE18-01232375CE42}", "testproduct", "10.0.0.0");

업데이트 : ORCA를 사용하는 것은 훌륭한 옵션입니다. 프로그래밍 방식으로 달성 할 수 있다면이를 사용하여 자동 릴리스 노트를 생성 할 수 있습니다. 그리고 UNSTALL 프로그램에서도.

도움이 되었습니까?

해결책

당신은 사용할 수 있습니다 MSI 작업을위한 COM 기반 API, 그리고 같은 일을하십시오

Function GetVersion(ByVal msiName)

    Const msiOpenDatabaseModeReadOnly = 0
    Dim msi, db, view

    Set msi = CreateObject("WindowsInstaller.Installer")
    Set db = msi.OpenDataBase(msiName, msiOpenDatabaseModeReadOnly)
    Set view = db.OpenView("SELECT `Value` FROM `Property` WHERE `Property` = 'ProductVersion'")
    Call view.Execute()

    GetVersion = view.Fetch().StringData(1)

End Function

다른 팁

당신이 사용할 수있는 Microsoft의 orca.exe. ORCA를 사용하면 MSI를 열고 모든 테이블을 편집/볼 수 있습니다. 전체를 다운로드해야합니다 Windows SDK 그것을 얻기 위해, 그러나 고맙게도 그것은 무료입니다.

한 가지 대안 (SDK의 다운로드 크기로 인해 더 빠를 수 있음)은 Dark.exe를 사용하는 것입니다. WIX 프로젝트. Dark는 MSI 디 컴파일러로 모든 것을 XML 파일과 리소스 모음으로 내 보냅니다. XML IT 출력에는 원하는 정보가 있습니다.

나는 지금 상황이 훨씬 쉬워 졌다고 언급하고 싶습니다. Windows Installer 객체 모델에 대한 전체 .NET 래퍼가 있으므로 COM Interop Clunkiness를 피할 수 있습니다..

래퍼는 "배포 도구 재단"(DTF) 그리고 여기에 기본 설명이 있습니다."Deployment Tools Foundation은 Windows 배포 플랫폼 기술을 .NET 세계로 가져 오는 풍부한 .NET 클래스 라이브러리 및 관련 리소스 세트입니다. 기본 기술의 완전한 기능을 여전히 노출시키면서 배포 관련 개발 작업을 크게 단순화하도록 설계되었습니다.".

다음은 제거 된 실습 샘플입니다:

using (var db = new Database(FullPath, DatabaseOpenMode.ReadOnly))
{    
  PackageCode = db.SummaryInfo.RevisionNumber;
  AppVendor = db.SummaryInfo.Author;
  AppName = db.SummaryInfo.Title;
  ProductName = db.SummaryInfo.Subject;
  ProductCode = (string)db.ExecuteScalar("SELECT `Value` FROM "+
                 "`Property` WHERE `Property` = 'ProductCode'");
  AppVersion = (string)db.ExecuteScalar("SELECT `Value` FROM "+
                 "`Property` WHERE `Property` = 'ProductVersion'");
  UpgradeCode = (string)db.ExecuteScalar("SELECT `Value` FROM "+
                 " `Property` WHERE `Property` = 'UpgradeCode'");
}

기본 DTF 파일 (후자의 두 사람은 가장 많이 사용되는 것입니다) :

  • Microsoft.deployment.compression.dll - 아카이브 포장 및 포장 풀기를위한 프레임 워크.
  • Microsoft.deployment.compression.cab.dll - 캐비닛 아카이브 포장 및 포장 풀기를 구현합니다.
  • Microsoft.deployment.resources.dll - 실행 파일에서 리소스 데이터를 읽고 쓰는 클래스.
  • Microsoft.deployment.windowsinstaller.dll - Windows Installer API에 대한 .NET 기반 클래스 라이브러리를 완료하십시오.
  • Microsoft.deployment.windowsinstaller.package.dll - Windows Installer 설치 및 패치 패키지 작업을위한 확장 클래스.

C# 프로젝트를 만들고,이 파일을 참조하고, 원하는 컨트롤과 필요한 컨트롤로 자신의 배포 애플리케이션을 코딩하기 만하면됩니다. 나는 현재 DTF를위한 도구로 설정되지 않았지만 이 샘플 C# 프로그램이 어떻게 작동하는지에 대한 일반적인 아이디어.

다음은 부트 스트레이퍼 실행 가능성을 만드는 데 빌드 프로세스의 일부로 사용하는 VBScript의 유사한 예입니다 ...

Option Explicit
Const MY_MSI = "product.msi"

Dim installer, database, view, result, sumInfo, sPackageCode

Set installer = CreateObject("WindowsInstaller.Installer")
Set database = installer.OpenDatabase (MY_MSI, 0)

Set sumInfo = installer.SummaryInformation(MY_MSI, 0)
sPackageCode =  sumInfo.Property(9) ' PID_REVNUMBER = 9, contains the package code.

WScript.Echo "ProductVersion=" & getproperty("ProductVersion")
WScript.Echo "ProductCode=" & getproperty("ProductCode") 
WScript.Echo "PackageCode=" & sPackageCode 
WScript.Echo "ProductName=" & getproperty("ProductName") 

Function getproperty(property)

    Set view = database.OpenView ("SELECT Value FROM Property WHERE Property='" & property & "'")
    view.Execute
    Set result = view.Fetch
    getproperty = result.StringData(1)

End Function 

가벼운 비 프로그램용 솔루션을 찾았습니다 Lessmsi. 분명히 Wix를 사용하고 전체 .msi를 지정된 폴더로 폭발시킵니다. (또한 UI가 있지만 Win7에서는 나에게 큰 도움이되지 않았습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top