C# 我可以在窗口标题中指定productversion吗?

C# 我可以在窗口标题中指定productversion吗?,c#,visual-studio,version,C#,Visual Studio,Version,为了让人们知道他们正在使用的程序的版本,我想在窗口的标题中显示productversion。我可以手动完成,但我希望这是动态的,所以每次版本更改时,我不必同时更改这两项 这是否可能在不干扰安装程序的情况下在代码隐藏中执行此操作?尝试此操作: System.Reflection.Assembly.getExecutionGassembly().GetName().Version.ToString()您可以使用以下代码从属性检索版本: Version version = Assembly.GetEx

为了让人们知道他们正在使用的程序的版本,我想在窗口的标题中显示productversion。我可以手动完成,但我希望这是动态的,所以每次版本更改时,我不必同时更改这两项

这是否可能在不干扰安装程序的情况下在代码隐藏中执行此操作?

尝试此操作:

System.Reflection.Assembly.getExecutionGassembly().GetName().Version.ToString()

您可以使用以下代码从属性检索版本:

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信息中读取安装程序的版本。这最好基于安装程序指定的升级代码来完成,因为升级代码不应在版本之间更改。以下示例程序演示如何获取属于特定升级代码的已安装版本1:

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;
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Runtime.InteropServices;
使用系统文本;
班级计划
{
[DllImport(“msi.dll”,CharSet=CharSet.Unicode)]
静态外部程序Int32 MsiGetProductInfo(字符串产品、字符串属性、,
[Out]StringBuilder valueBuf,参考Int32 len);
[DllImport(“msi.dll”,CharSet=CharSet.Auto,SetLastError=true)]
静态外部Int32 MsiEnumRelatedProducts(字符串strUpgradeCode,
int保留、int iIndex、StringBuilder sbProductCode);
静态void Main(字符串[]参数)
{
列出已安装的版本=
GetInstalledVersions({169C1A82-2A82-490B-8A9A-7AB7E4C7DEFE});
foreach(installedVersions中的var项)
{
控制台写入线(项目);
}
}
静态列表GetInstalledVersions(字符串升级代码)
{
列表结果=新列表();
StringBuilder sbProductCode=新的StringBuilder(39);
int iIdx=0;
当(
0==MsiEnumRelatedProducts(升级代码,0,iIdx++,sbProductCode))
{
Int32 len=512;
StringBuilder sbVersion=新的StringBuilder(len);
MsiGetProductInfo(sbProductCode.ToString(),
“版本字符串”,sbVersion,ref len);
result.Add(sbVersion.ToString());
}
返回结果;
}
}
1请注意,可能会同时安装一个产品的多个版本。在这种罕见的情况下,您会得到一个包含所有已安装版本的列表。

如下所示:

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

这将读取AssemblyInfo.cs中的
[assembly:AssemblyVersion(“…”)
属性,该属性也可以在项目属性中设置(通过单击AssemblyInformation…)按钮)

以下是我使用数据绑定和反射的解决方案:

在XAML中:


您不应在此处使用
String.Format
。另外,
typeof(MyForm).Assembly
会快得多。@SLaks:这确实稍微慢了一点,但我怀疑这是否会有意义(除非你想每秒查询1000次版本,但是你还有一个更大的问题;-)。但是需要注意的是,
Assembly.getExecutionGassembly()
typeof(MyForm).Assembly
可以是不同的东西,所以您应该仔细选择您需要的任何东西。@Pete:为什么在不需要的时候强制进行字符串分析?您的版本给出了1.0.0.0,而设置为1.0.16,这是为什么?@djerry:安装版本和程序集版本是不同的。程序集版本在项目的“属性”子文件夹的文件AssemblyInfo.cs中指定。
<Window ...
        Title="{Binding WindowTitle, RelativeSource={RelativeSource Mode=Self}}"
        >
public string WindowTitle
{
    get
    {
        Version version = Assembly.GetExecutingAssembly().GetName().Version;
        return "MyTitle v" + version;
    }
}