如何使用C#以编程方式获取正在运行的程序的产品(而非汇编)版本?

时间:2013-02-22 07:11:24

标签: c# visual-studio installshield

我有一个我写过的程序,我正在尝试创建一个关于框的文件。我最近将我的程序产品版本更新为1.00.0003,我希望将其反映在about窗口中。

aboutBox的默认设置显示值1.0.0.0,即程序集版本,而不是产品版本。我一直在互联网上寻找如何显示产品版本。我尝试了所有这些:

{
    Assembly assembly = Assembly.GetExecutingAssembly();
    FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
    string version = fileVersionInfo.ProductVersion;

    Debug.WriteLine(version);
    Debug.WriteLine(assembly.GetName().Version);
    string v = VersionNumber;
    Debug.WriteLine(v);
    Debug.WriteLine( fileVersionInfo.FileVersion);
    Debug.WriteLine(Application.ProductVersion);
    Debug.WriteLine(AssemblyProductVersion);


    Assembly assembly2 = Assembly.GetEntryAssembly();
    FileVersionInfo fileVersionInfo2 = FileVersionInfo.GetVersionInfo(assembly.Location);
    string version2 = fileVersionInfo2.ProductVersion;
    Debug.WriteLine(version2);
    Debug.WriteLine(assembly2.GetName().Version);

    return version;
}

private string _ourVersion = "Version: v";

private string VersionNumber
{
    get
    {
        System.Reflection.Assembly _assemblyInfo =
        System.Reflection.Assembly.GetExecutingAssembly();
        if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
            _ourVersion += ApplicationDeployment.CurrentDeployment.CurrentVersion.ToString();
        else
        {
            if (_assemblyInfo != null)
                _ourVersion += _assemblyInfo.GetName().Version.ToString();
        }
        return _ourVersion;
    }
}

private static string AssemblyProductVersion
{
    get
    {
        object[] attributes = Assembly.GetExecutingAssembly()
            .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false);
        return attributes.Length == 0 ?
            "" :
            ((AssemblyInformationalVersionAttribute)attributes[0]).InformationalVersion;
    }
}

这些中的每一个都返回1.0.0.0(是的,我确实在控制台中查找了它们的输出,而不是实际显示的内容),而不是我需要的1.00.0003。产品版本在InstallShield设置的“常规信息”选项卡中设置。安装时,转到程序和功能显示产品版本为1.00.0003,所以我无法弄清楚为什么这么难以以编程方式检索此值。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您的产品版本应与装配版本相匹配 - 请查看How to make Product Version property match executable's version number automatically

答案 1 :(得分:1)

您要检索的版本1.00.0003是产品安装程序的版本。要以编程方式获取此版本,您需要检查安装程序(MSI文件),而不是已安装的文件。我不确定这是你想做什么,但问题Checking ProductVersion of an MSI programatically的答案解释了如何做到这一点。

如果您希望您的可执行文件包含相同的版本号,则需要使用诸如AssemblyFileVersion之类的.NET属性或Windows VERSIONINFO资源以某种方式存储版本号。

InstallShield允许您在命令行上指定产品版本。这允许您将产品版本存储在单个文件中,然后将其用作安装程序中嵌入的产品版本以及程序集的AssemblyFileVersion的来源。

答案 2 :(得分:0)

如果只有安装程序知道此版本信息,那么可以从中检索它的唯一地方就是注册表。

Uninstall Registry Key

  

以下安装程序属性提供在注册表项下编写的值:

     

VersionMinor派生自ProductVersion属性

     

VersionMajor派生自ProductVersion属性

     

从ProductVersion属性派生的版本

但我会选择@ devdigital(暗示)的建议 - 你应该有一个装配版本与你的安装程序版本匹配。