我有一个从我的C#Visual Studio 2010构建的MSI文件。该版本通过Version
属性设置。我想知道是否有办法确定版本而无需安装文件。目前,当右键单击并查看属性时,它不会显示。
答案 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
下添加引用。