Могу ли я указать версию продукта в заголовке окна? - PullRequest
6 голосов
/ 08 июня 2010

Чтобы люди знали, какую версию программы они используют, я хочу показать версию продукта в заголовке окна. Я могу сделать это вручную, но я хочу, чтобы это было динамическим, поэтому мне не нужно менять оба элемента каждый раз, когда меняется версия.

Возможно ли это сделать в коде, не мешая установщику?

Ответы [ 4 ]

8 голосов
/ 08 июня 2010

Вы можете получить версию из свойства AssemblyName.Version, используя следующий код:

Version version = Assembly.GetExecutingAssembly().GetName().Version;

this.Text = "My Cool Product - Version " + version;

// or with a fancier formatting
this.Text = string.Format("My Cool Product - Version {0}.{1}.{2} Revision {3}", 
    version.Major, version.Minor, version.Build, version.Revision);

Обновление (после комментария):

Вы также можете прочитать версию установки из информации MSI, хранящейся в реестре. Лучше всего это делать на основе UpgradeCode , заданного вашей установкой, поскольку UpgradeCode не должен меняться между версиями. В следующем примере программы показано, как получить установленные версии 1 , относящиеся к определенному коду UpgradeCode:

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;

class Program
{
    [DllImport("msi.dll", CharSet = CharSet.Unicode)]
    static extern Int32 MsiGetProductInfo(string product, string property, 
        [Out] StringBuilder valueBuf, ref Int32 len);

    [DllImport("msi.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern Int32 MsiEnumRelatedProducts(string strUpgradeCode, 
        int reserved, int iIndex, StringBuilder sbProductCode);

    static void Main(string[] args)
    {
        List<string> installedVersions = 
            GetInstalledVersions("{169C1A82-2A82-490B-8A9A-7AB7E4C7DEFE}");

        foreach (var item in installedVersions)
        {
            Console.WriteLine(item);
        }
    }

    static List<string> GetInstalledVersions(string upgradeCode)
    {
        List<string> result = new List<string>();
        StringBuilder sbProductCode = new StringBuilder(39);
        int iIdx = 0;
        while (
            0 == MsiEnumRelatedProducts(upgradeCode, 0, iIdx++, sbProductCode))
        {
            Int32 len = 512;
            StringBuilder sbVersion = new StringBuilder(len);

            MsiGetProductInfo(sbProductCode.ToString(), 
                "VersionString", sbVersion, ref len);

            result.Add(sbVersion.ToString());
        }
        return result;
    }
}

1 Обратите внимание, что может быть параллельно установлено несколько версий одного продукта. В этом редком случае вы получите список со всеми установленными версиями.

6 голосов
/ 08 июня 2010

попробуйте это:
System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();

0 голосов
/ 05 апреля 2019

Вот мое решение с использованием DataBinding и Reflection:

В XAML:

<Window ...
        Title="{Binding WindowTitle, RelativeSource={RelativeSource Mode=Self}}"
        >

В коде:

public string WindowTitle
{
    get
    {
        Version version = Assembly.GetExecutingAssembly().GetName().Version;
        return "MyTitle v" + version;
    }
}
0 голосов
/ 08 июня 2010

Например:

Text = "MyApplication v" + typeof(MyForm).Assembly.GetName().Version;

Это будет считывать атрибут [assembly: AssemblyVersion("...")] из AssemblyInfo.cs, который также можно установить в свойствах проекта (нажав Информация о сборке ... кнопка)

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