2012-03-18 29 views
4

我创建一个cutomization软件,该软件将尽一切标准化的MST文件。 下面是类,将改变产品名称和genrate变换的代码。生成MSI变换使用C#

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()被调用这将让detween 2个MSI文件的区别并创建一个转换文件。 现在的问题是,当genrateTrans()被调用,那么它会赶上它的块作为inst.OpenDatabase回报“MSI API错误”。 在我看来,通过editTransform装箱文件的副本仍然被它锁定,是不可用的generateTrans()menthod。 请在这里帮忙。

PS:用于编辑模式变换是办理。

回答

5

而不是做的COM互操作的,在结账的Windows Installer XML部署工具基金会找到了远优于互操作库(Microsoft.Deployment.WindowsInstaller)。你会发现它更容易使用。

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); 
       } 
      } 
     } 
    } 
} 
+1

谢谢克里斯托弗,真的帮了我很多。 – 2012-07-29 15:57:07