using System;
using System.IO;
using Microsoft.Deployment.WindowsInstaller;
namespace ConsoleApplication1
{
class Program
{
const string REFERENCEDATABASE = @"C:\orig.msi";
const string TEMPDATABASE = @"C:\temp.msi";
const string TRANSFORM = @"c:\foo.mst";
static void Main(string[] args)
{
File.Copy(REFERENCEDATABASE, TEMPDATABASE, true);
using (var origDatabase = new Database(REFERENCEDATABASE, DatabaseOpenMode.ReadOnly))
{
using (var database = new Database(TEMPDATABASE, DatabaseOpenMode.Direct))
{
database.Execute("Update `Property` Set `Property`.`Value` = 'Test' WHERE `Property`.`Property` = 'ProductName'");
database.GenerateTransform(origDatabase, TRANSFORM);
database.CreateTransformSummaryInfo(origDatabase, TRANSFORM, TransformErrors.None, TransformValidations.None);
}
}
}
}
}
大家好,这段代码适用于WiX Toolset。我只是在没有WiX Toolset的情况下使用msi.dll中的WindowsInstaller参考来尝试做同样的事情。诀窍是当程序试图创建转换摘要信息时,我总是得到异常。在原始MSI文件上也会发生同样的情况,模式更改没有帮助。
这是我尝试运行的代码部分:
Type installerType = Type.GetTypeFromProgID("WindowsInstaller.Installer");
// Create the Windows Installer object
WindowsInstaller.Installer installer = (WindowsInstaller.Installer)Activator.CreateInstance(installerType);
// Open the MSI database in the input file
Database msiDatabase = installer.OpenDatabase(msiFile, MsiOpenDatabaseMode.msiOpenDatabaseModeReadOnly);
transFile = path + "\\" + nameSuggestionMst;
//backup file creation
backupMsiFile = path + "\\" + "backup_" + nameSuggestion + ".msi";
File.Copy(msiFile, backupMsiFile, true);
WindowsInstaller.Installer backupEditor = (WindowsInstaller.Installer)Activator.CreateInstance(installerType);
Database transDatabase = backupEditor.OpenDatabase(backupMsiFile, MsiOpenDatabaseMode.msiOpenDatabaseModeDirect);
transDatabase.GenerateTransform(msiDatabase, transFile);
transDatabase.CreateTransformSummaryInfo(msiDatabase, transFile, MsiTransformError.msiTransformErrorNone, MsiTransformValidation.msiTransformValidationNone);
transDatabase.ApplyTransform(transFile, MsiTransformError.msiTransformErrorNone);