需要一种方法来获取msi安装程序在c#中运行时使用的版本#,而不知道用于安装的msi文件的位置

Isa*_*ger 1 c#-4.0

我正在开发一个从中心点自动更新程序的方案.为了帮助我,我需要一种方法来获取用于在运行时安装progarm的msi文件的版本号,因此我可以将安装的版本与服务器上的最新版本进行比较(已经解决了这部分)并决定是否不要更新.为了清楚起见,我已经有一种方法可以使用msi.dll打开msi文件并获取版本#out.问题是引导问题.如果用户第一次安装程序,我的程序如何知道在哪里找到msi文件(在客户端上)?

解决方案可以像msi一样简单,在运行时创建一个版本为#的文本文件.如果可以,我想避免查询注册表.

如果我无法弄清楚这一点,我将不得不特别注意在GUI项目和MSI安装程序中保持版本#相同,这让我很烦.

有什么想法吗?

mtr*_*eit 5

我假设你想获得MSI的ProductVersion属性.

您可以使用COM相当容易地完成此操作.

将"Microsoft Windows Installer对象库"的COM引用添加到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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)