MSI 파일 내부의 속성을 프로그래밍 방식으로 읽는 방법은 무엇입니까?
-
08-07-2019 - |
문제
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# 프로그램이 어떻게 작동하는지에 대한 일반적인 아이디어.
- DTF는 WIX에 포함되어 있습니다. 여기에서 wix를 다운로드하십시오.
- DTF DLL은 기본 WIX 설치 폴더의 SDK 폴더에 있습니다 (기본 위치는 다음과 같습니다. 버전 번호는 아마도 이것을 볼 때마다 다를 것입니다. %programfiles (x86) %아래의 Wix 폴더를 찾으십시오.
- 찾으십시오 DTF 도움말 파일 "Doc"폴더에서. dtf.chm 그리고 dtfapi.chm. 객체 모델과 사용법에 대한 절대적으로 우수한 문서.
- 보다 이 serverfault.com 게시물 더 많은 DTF 세부 사항
- Wix 작업을위한 일부 스타터 제안 : MSI vs Nuget 패키지 : 지속적인 전달에 더 좋은 것은 무엇입니까?
다음은 부트 스트레이퍼 실행 가능성을 만드는 데 빌드 프로세스의 일부로 사용하는 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에서는 나에게 큰 도움이되지 않았습니다).