7

MSIファイル内のプロパティを読み取る方法はありますか?

たとえば、Testpackage.msiという名前の MSI ファイルがある場合、次を見つける必要があります。

productName
PackageCode
version

これを WMI アンインストールで使用します

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

これがプログラムで実現できる場合、Orcaを使用することは優れたオプションです。次に、これを使用して自動リリース ノートを生成できます。また、プログラムのアンインストールでも。

4

5 に答える 5

7

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
于 2008-11-30T10:32:20.213 に答える
7

WiX ツールセット: WiX のクイック スタートのヒント(リソースへのリンク集)。WiX は DTF をインストールします。


物事がさらに簡単になったことに言及したいだけです。Windows インストーラー オブジェクト モデル用の完全な .NET ラッパーがあるため、COM 相互運用のぎこちなさを回避できます

DTF - はじめに: メイン ファイル:Microsoft.Deployment.WindowsInstaller.dll

  1. WiX ツールキットをダウンロードしてインストールする
  2. WixInstallPath\SDKディレクトリで以下のファイルを見つけます

ラッパーは " Deployment Tools Foundation " (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 ファイル(後者の 2 つは最もよく使用されるファイルです):

  • Microsoft.Deployment.Compression.dll - アーカイブのパッキングとアンパッキングのためのフレームワーク。
  • Microsoft.Deployment.Compression.Cab.dll - キャビネット アーカイブのパックとアンパックを実装します。
  • Microsoft.Deployment.Resources.dll - 実行可能ファイルのリソース データを読み書きするためのクラス。
  • Microsoft.Deployment.WindowsInstaller.dll - Windows インストーラー API 用の完全な .NET ベースのクラス ライブラリ。
  • Microsoft.Deployment.WindowsInstaller.Package.dll - Windows インストーラーのインストールとパッチ パッケージを操作するための拡張クラス。

C# プロジェクトを作成し、これらのファイルを参照して、必要に応じて制御できる独自の展開アプリケーションをコーディングするだけです。現時点では DTF 用のツールをセットアップしていませんが、C# プログラムがどのように機能するかについての一般的なアイデアについては、このサンプルを参照してください。

  • DTF は WIX に含まれています。ここから WiX をダウンロードします
  • DTF dll は、メインの WiX インストール フォルダーの SDK フォルダーにあります (デフォルトの場所は %ProgramFiles(x86)%\WiX Toolset v3.10\SDK です)。バージョン番号は、これが表示されるまでにはおそらく異なるでしょう。%ProgramFiles(x86)% の下にある WiX フォルダを探してください。
  • 「doc」フォルダでDTF ヘルプ ファイルを探します。DTF.chmおよびDTFAPI.chm。オブジェクト モデルとその使用法に関する非常に優れたドキュメントです。
  • DTF の詳細については、この serverfault.com の投稿を参照してください。
  • WiX を使用するためのいくつかのスターターの提案
于 2009-06-30T03:40:31.530 に答える
6

Microsoft の Orca.exeを使用できます。Orca では、MSI を開いて、その中のすべてのテーブルを編集/表示できます。入手するにはWindows SDK全体をダウンロードする必要がありますが、ありがたいことに無料です。

1 つの代替手段 (SDK のダウンロード サイズにより高速になる場合があります) は、WiX プロジェクトの dark.exe を使用することです。Dark は、すべてを XML ファイルとリソースのコレクションにエクスポートする MSI 逆コンパイラです。出力される XML には、探している情報が含まれています。

于 2008-11-18T14:23:14.713 に答える
3

これは、ブートストラップ実行可能ファイルを作成するビルドプロセスの一部として使用する 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 
于 2009-06-30T13:00:39.237 に答える
0

lessmsiで軽量の非プログラム ソリューションを見つけました。どうやらwixを使用しており、.msi全体を指定されたフォルダーに展開するだけです。(UI もありますが、Win7 ではうまく表示されませんでした)。

于 2011-02-02T22:33:28.050 に答える