2011-01-14 41 views
1

我在Visual Studio 2010中有一個基本的安裝項目,而且我正在努力設置自定義操作。我在一個單獨的程序集中有3個安裝程序類。在安裝之前運行自定義動作

3班做以下事情:

  • 檢查參數,以允許與授權信息無人值守安裝(覆蓋Install法)
  • 刪除先前安裝的軟件(與NSIS安裝安裝,使用BeforeInstall事件)
  • 停止程序,如果它正在運行,使用BeforeInstall事件

問題是最後一個,看起來BeforeInstall事件從未觸發。我試圖讓它在磁盤上創建一個文件,並顯示一個MessageBox。它從不觸發。

「SetupActions的主要輸出」已添加到「自定義操作」編輯器中的「安裝」部分。我的安裝程序類都有[RunInstaller(true)]

碼不起作用:

[RunInstaller(true)] 
public partial class InstallerStopProgram : System.Configuration.Install.Installer 
{ 
    public InstallerStopProgram() 
    { 
     InitializeComponent(); 
    } 

    private void InstallerStopProgram_BeforeInstall(object sender, InstallEventArgs e) 
    { 
     MessageBox.Show("This is never displayed during the install"); 
    } 
} 

回答

2

問題這種方法是要運行安裝前東西東西駐留在DLL/EXE,它獲取到目標機僅作爲安裝的一部分。因此,除非安裝完成,否則您的磁盤上的BeforeInstall代碼將不會運行(並且只能在安裝後才能運行)。

據我所知,你想達到的是VS 2010安裝項目不可能實現的。也許,你應該使用Wix(或NSIS)!

+0

不幸的是我的項目有NSIS是繁瑣的在這裏解釋的問題。有什麼方法可以使用在安裝啓動之前運行的VS安裝程序來運行任何代碼? – 2011-01-14 10:52:19

0

VinacC上面是正確的。要正確執行此操作,需要在文件成本覈算之前完成此操作。引導員將是一個很好的去做的地方。在Windows安裝程序開始查看需要完成哪些操作以獲取最新版本之前,您希望清除舊版NSIS版本的機器。

0

您不需要遷移到WiX,但是如果您在某種程度上使用了WiX,則可以這樣做。

首先,您必須將您的C#代碼轉移到WiX Custom Action

然後你會用下列JScript代碼嵌入這個自定義操作進入MSI:

var installer = WScript.CreateObject("WindowsInstaller.Installer"); 
var filespec = WScript.Arguments(0); 
var msiOpenDatabaseModeTransact = 1; 
var msiViewModifyAssign   = 3; 
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact); 

var sqlQuery = "SELECT `Name`,`Data` FROM Binary"; 
var view = database.OpenView(sqlQuery); 
var record = installer.CreateRecord(2); 
record.StringData(1) = "myAction"; 
view.Execute(record); 
var binaryPath = WScript.ScriptFullName.replace(WScript.ScriptName, "SetupAction.CA.dll"); 
record.SetStream(2, binaryPath); 
view.Modify(msiViewModifyAssign, record); 
Execute("INSERT INTO `CustomAction` (`Action`, `Type`, `Source`, `Target`) VALUES ('myActionId', 1, 'myAction', 'MySimpleAction')"); 
Execute("INSERT INTO `InstallUISequence` (`Action`, `Sequence`) VALUES ('myActionId', 26)"); 
database.Commit(); 

function Execute(sql) { 
    view = database.OpenView(sql); 
    view.Execute(); 
    view.Close(); 
} 
相關問題