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:用於編輯模式變換是辦理。
謝謝克里斯託弗,真的幫了我很多。 – 2012-07-29 15:57:07