2012-03-18 65 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