WindowsInstaller创建和编辑MST文件

时间:2014-08-21 10:29:02

标签: wix installer windows-installer transform

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);

0 个答案:

没有答案