2012-01-19 5 views
1

Я пытаюсь использовать библиотеку WiX для анализа некоторых машинных продуктов для проекта, в котором я работаю. Я почесываю голову, почему это отсутствует в классе в названии?Microsoft.Deployment.WindowsInstaller.ProductInstallation не имеет свойства UpgradeCode

Есть ли способ получить это из библиотеки WiX, которую мне не хватает? Я знаю, как это сделать с помощью msi.dll interop, но хотелось попробовать сделать все из одной библиотеки. Мне просто кажется странным, что такая ключевая часть пакета MSI отсутствует.

WiX версия 3.5.2519.0

+0

Итак, я копал глубже, и мне не нравится, но это работает ... Я сделал: // Комментарий идет элегантного здесь отсутствует UpgradeCode в ProductInstallation классе ... строка UpgradeCode; using (База данных db = новая база данных (установка.LocalPackage, DatabaseOpenMode.ReadOnly)) { upgradeCode = (строка) db.ExecuteScalar ("SELECT Value FROM Property WHERE Property = 'UpgradeCode'"); } Console.WriteLine ("UpgradeCode: {0}", upgradeCode); – joebalt

+0

Я объяснил, почему UpgradeCode там нет. Если это действительно вас беспокоит, вы можете написать метод расширения. –

+0

Думаю, у нас есть проблема с сроками. Я отправил свой комментарий, прежде чем я увидел ваш ответ, Кристофер. Все хорошо. Я просто удивлен тем, что со всеми другими полями там, где корневой метод (MsiGetProductInfo) не возвращает UpgradeCode, поскольку он является такой важной частью продукта в конце концов. – joebalt

ответ

3

Класс ProductInstallation инкапсулирует функцию MsiGetProductInfo найденную в msi.dll. Поскольку эта функция не выставляет UpgradeCode, также не происходит ProductInstallation.

В разделе ProductInstallation есть элемент InstallSource (INSTALLPROPERTY_INSTALLSOURCE equiv), и вы можете использовать его для создания класса InstallPackage и доступа к его объекту доступа к свойствам.

static public string GetPackageUpgradeCode(string packagePath) 
{ 
    string upgradeCode = string.Empty; 
    using (InstallPackage package = new InstallPackage(packagePath, DatabaseOpenMode.ReadOnly)) 
    { 
     upgradeCode = package.Property["UpgradeCode"]; 
    } 
    return upgradeCode; 
} 

Если вы действительно не хотите, чтобы добавить еще один refrence вы можете открыть его в качестве базы данных и использовать элемент ExecuteScalar для выбора значения UpgradeCode из таблицы свойств.

Смежные вопросы