Нужен способ получить версию #, используемую установщиком MSI во время выполнения в C #, не зная расположения MSI-файла, используемого для установки - PullRequest
1 голос
/ 16 ноября 2010

Я разрабатываю схему автоматического обновления моей программы из центральной точки. Чтобы помочь мне в этом, мне нужен способ получить версию # MSI-файла, используемого для установки Progarm во время выполнения, чтобы я мог сравнить установленную версию с последней версией на сервере (уже решена эта часть) и решить, или не обновлять. Чтобы было ясно, у меня уже есть способ открыть MSI-файлы, используя msi.dll и получить версию #. Проблема заключается в начальной загрузке. Если пользователь устанавливает программу в первый раз, как моя программа может узнать, где найти файл msi (на клиенте)?

Решение может быть таким же простым, как создание MSI текстового файла с версией # в нем при запуске. Я бы хотел не запрашивать реестр, если смогу.

Если я не могу понять это, мне придется проявить особую осторожность, чтобы версия # оставалась неизменной в проекте GUI, а также в установщике MSI, и эта мысль меня раздражает.

Есть мысли?

Ответы [ 2 ]

5 голосов
/ 16 ноября 2010

Я предполагаю, что вы хотите получить свойство ProductVersion MSI.

Вы можете сделать это довольно легко, используя COM.

Добавьте ссылку COM на "Библиотеку объектов установщика Microsoft Windows" в ваш проект C #.

Затем попробуйте следующую программу:

namespace TestCS
{
    using System;
    using WindowsInstaller;

    internal class Test
    {
        private static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                return;
            }

            Console.WriteLine(GetMsiVersion(args[0]));
        }

        private static string GetMsiVersion(string installerPath)
        {
            Type t = Type.GetTypeFromProgID("WindowsInstaller.Installer");
            Installer inst = (Installer)Activator.CreateInstance(t);
            Database d = inst.OpenDatabase(
                installerPath, 
                MsiOpenDatabaseMode.msiOpenDatabaseModeReadOnly);
            View v = d.OpenView(
                "SELECT * FROM Property WHERE Property = 'ProductVersion'");
            v.Execute(null);
            Record r = v.Fetch();
            string result = r.get_StringData(2);
            return result;
        }
    }
}
0 голосов
/ 05 октября 2011

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall раздел реестра содержит подразделы ProductCode установленных программ.Панель управления «Добавить / удалить проблемы» и MSI Engine работают с этой веткой.

Итерируя по этим подразделам, вы можете найти GUID вашей программы (если вы сохраняете старое значение при изменении версии в проекте установки и развертывания).Под этим подразделом строковое значение 'DisplayVersion' будет содержать установленную версию (соответствует свойству 'Version' в проекте SnD).

Если вы измените ProductCode при увеличении номера версии (как рекомендует VisualStudio), строка 'DisplayName' можетполезно для определения того, какой подраздел представляет вашу программу, он соответствует свойству «ProductName» в проекте SnD.

Некоторые программы могут быть перечислены в HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall при установке для каждого пользователя (например, через ClickOnce).).
В 64-битных системах в дополнение к оригиналу есть HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall для 32-битных программ, которые в этой среде отслеживают 64-битные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...