Генерация MSI-преобразования с использованием C # - PullRequest
4 голосов
/ 18 марта 2012

Я создаю программное обеспечение для резки, которое выполнит всю стандартизацию файла MST. Ниже приведен код класса, который изменит название продукта и преобразование рода.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WindowsInstaller;
using System.Data;

namespace Automation
{
    class CustomInstaller
    {
        public CustomInstaller()
        {
        }
        public Record getInstaller(string msiFile,MsiOpenDatabaseMode mode,string query)
        {
            Type type = Type.GetTypeFromProgID("WindowsInstaller.Installer");
            Installer inst = (Installer)Activator.CreateInstance(type);
            Database db = inst.OpenDatabase(msiFile, mode);
            WindowsInstaller.View view = db.OpenView(query);
            view.Execute(null); 
            Record record = view.Fetch();
            db.Commit();
            return record;

        }
        public bool generateTrans(string file1, string file2,string transName)
        {
            Type type = Type.GetTypeFromProgID("WindowsInstaller.Installer");
            Installer inst = (Installer)Activator.CreateInstance(type);
            Database db1 = inst.OpenDatabase(file1, MsiOpenDatabaseMode.msiOpenDatabaseModeReadOnly);

            try
            {
                Database db2 = inst.OpenDatabase(file2, MsiOpenDatabaseMode.msiOpenDatabaseModeReadOnly);
                return db2.GenerateTransform(db1, transName);

            }
            catch (Exception e) { }
            return false;
        }
        public int editTransform(string msiFile, MsiOpenDatabaseMode mode, string query)
        {
            Type type = Type.GetTypeFromProgID("WindowsInstaller.Installer");
            Installer inst = (Installer)Activator.CreateInstance(type);
            Database db = inst.OpenDatabase(msiFile, mode);
            WindowsInstaller.View view = db.OpenView(query);
            view.Execute(null);
            db.Commit();
            int o=(int)db.DatabaseState;
            db = null;
            inst = null;
            type = null;
            return 1;
        }
    }
}

Сначала вызывается editTransform (), который создает копию оригинального msi и вносит в нее некоторые изменения, затем вызывается generateTrans (), который получает разницу между двумя файлами msi и создает файл преобразования. Теперь проблема заключается в том, что когда вызывается genrateTrans (), он перехватывает его блок, когда inst.OpenDatabase возвращает «MSI Api Error». Мне кажется, что копия файла, созданного editTransform, все еще заблокирована им и недоступна для использования в методе generateTrans (). Пожалуйста, помогите здесь.

PS: режим, используемый для редактирования преобразования, является транзакционным.

1 Ответ

7 голосов
/ 19 марта 2012

Вместо COM-взаимодействия извлеките намного лучшую библиотеку взаимодействий (Microsoft.Deployment.WindowsInstaller), найденную в установщике Windows XML Deployment Tools Foundation.Вам будет намного проще в использовании.

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);
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...