Получить название продукта из MSI-файла в C # - PullRequest
5 голосов
/ 16 марта 2009

У меня есть MSI-файл, который устанавливает приложение. Мне нужно знать название продукта этого приложения до того, как начнется установка.

Я попробовал следующее:

{ 

...
Type type = Type.GetType("Windows.Installer");
WindowsInstaller.Installer installer = (WindowsInstaller.Installer)
Activator.CreateInstance(type);

installer.OpenDatabase(msiFile, 0); //this is my guess to pass in the msi file name...
...
}

а сейчас? Введите null , что выдает ошибку. И куда мне передать имя файла MSI?

Спасибо за любые подсказки и комментарии.

Ответы [ 3 ]

6 голосов
/ 17 марта 2009

Вам необходимо использовать:

        Type installerType = Type.GetTypeFromProgID("WindowsInstaller.Installer");

Вот пример из моего кода - в моем случае я получаю версию установщика:

        // Get the type of the Windows Installer object
        Type installerType = Type.GetTypeFromProgID("WindowsInstaller.Installer");

        // Create the Windows Installer object
        Installer installer = (Installer)Activator.CreateInstance(installerType);

        // Open the MSI database in the input file
        Database database = installer.OpenDatabase(inputFile, MsiOpenDatabaseMode.msiOpenDatabaseModeReadOnly);

        // Open a view on the Property table for the version property
        View view = database.OpenView("SELECT * FROM Property WHERE Property = 'ProductVersion'");

        // Execute the view query
        view.Execute(null);

        // Get the record from the view
        Record record = view.Fetch();

        // Get the version from the data
        string version = record.get_StringData(2);
2 голосов
/ 16 марта 2009

Не будет ли проще использовать этот код:

Type type = typeof(Windows.Installer);

Если вы предпочитаете перегрузку Type.GetType (String), вы должны включить правильное имя сборки после полного пути к классу, например ::

Type type = Type.GetType("Windows.Installer, <assembly for MsiInstaller>");

1 голос
/ 16 марта 2009

Откуда вы взяли материал "Windows.Installer"?

... потому что:

  1. Type.GetType принимает имя типа .NET, а не COM ProgId.
  2. Установщик Windows (по крайней мере, в Windows 2003) не имеет ProgId.

В итоге: используйте P / Invoke (DllImport и т. Д.) Для связи с MSI API.

...