2

C#get_PrimaryKeys()から関数を呼び出すのに問題があります。msi.dll特定のMSIテーブルの主キーを資金調達したいと思います。私は次のコードを使用します:

Type installerType = Type.GetTypeFromProgID("WindowsInstaller.Installer");
installer = (Installer)Activator.CreateInstance(installerType);
database = installer.OpenDatabase(MSIPath, MsiOpenDatabaseMode.msiOpenDatabaseModeTransact);
WindowsInstaller.Record data = null;     
data = database.PrimaryKeys[tableName];
string s = data.get_StringData(1);

を使用するdatabase.get_PrimaryKeys(tableName)と、同じエラーが発生します。

COMexception
Member not found. (Exception from HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))

msi.dllから他の関数​​を使用すると、正常に機能します。

何が問題ですか?

4

1 に答える 1

1

C#コードからMSIデータベースをクエリする簡単な方法があります。WiXツールセットには、DTF(Deployment Tools Foundation)と呼ばれる適切に設計された便利な.NET APIが含まれています。これにより、次の(C#)を記述できます。

  using (var database = new Database("path\\to\\package.msi", DatabaseOpenMode.ReadOnly))
  {
    var table = database.Tables["someTableName"];
    foreach (var column in table.PrimaryKeys)
    {
      Console.WriteLine("The table {0} defines {1} as primary key", table.Name, column);
    }
  }

あなたがしなければならないすべて:

  • WiXツールセットをインストールする
  • Microsoft.Deployment.WindowsInstaller.dllC#プロジェクトでの参照
  • using Microsoft.Deployment.WindowsInstaller;名前空間を追加

DTFを活用するために、WiXを使用してMSIを構築する必要はありません。詳細については、DTF.chm(WiXと一緒にインストール)を参照してください。

于 2012-10-05T06:08:41.083 に答える