确定MSI的版本而不安装它

时间:2011-08-22 10:04:21

标签: c# windows-installer

我有一个从我的C#Visual Studio 2010构建的MSI文件。该版本通过Version属性设置。我想知道是否有办法确定版本而无需安装文件。目前,当右键单击并查看属性时,它不会显示。

3 个答案:

答案 0 :(得分:6)

以下代码可能会有所帮助。但请记住,您应首先向Microsoft Windows Installer对象库添加COM引用,并将WindowsInstaller命名空间添加到您的代码中。您可能需要以下功能。

public static string GetMsiInfo( string msiPath, string Info)
{
   string retVal = string.Empty;

   Type classType = Type.GetTypeFromProgID( “WindowsInstaller.Installer” );
   Object installerObj = Activator.CreateInstance( classType );
   Installer installer = installerObj as Installer;

   // Open msi file
   Database db = installer.OpenDatabase( msiPath, 0 );

   // Fetch the property
   string sql = String.Format(“SELECT Value FROM Property WHERE Property=’{0}’”, Info);
   View view = db.OpenView( sql );
   view.Execute( null );

   // Read in the record
   Record rec = view.Fetch();
   if ( rec != null )
      retVal = rec.get_StringData( 1 );

   return retVal;
}

如果您需要该版本,请传入您想要的MSI文件的名称,例如

string version = GetMsiInfo( "d:\product.msi", “ProductVersion” );

答案 1 :(得分:3)

是的 - 我认为您需要检查MSI数据库,但这需要一些API调用或包装实用程序。

微软ORCA申请应该允许你这样做(虽然我自己从未尝试过)。

答案 2 :(得分:0)

您可以使用 wixtoolset SDK 中的 Microsoft.Deployment.WindowsInstaller 库,而不是使用 COM 库。引用后,您可以非常类似地获取版本信息。

private string GetMsiInfo(string msiPath)
{
    using (var database = new Microsoft.Deployment.WindowsInstaller.Database(msiPath))
    {
        var sql = "SELECT Value FROM Property WHERE Property ='ProductVersion'";
        using (var view = database.OpenView(sql))
        {
            view.Execute();

            using (var record = view.Fetch())
            {
                var version = record?.GetString(1);
                return version;
            }
        }
    }
}

我还没有找到通过 nuget 安装程序获得正确程序集的方法。但是,在我安装了 wixtoolset https://wixtoolset.org/releases/ 之后,我能够在我的项目中直接在 assemblies -> extensions -> Microsoft.Deployment.WindowsInstaller 下添加引用。