Gunakan Javascript CustomActions karena sangat mudah
Orang-orang mengatakan bahwa Javascript adalah hal yang salah untuk digunakan untuk MSI CustomActions . Alasan yang diberikan: sulit di-debug, sulit untuk diandalkan. Saya tidak setuju. Tidak sulit untuk debug, tentu tidak lebih sulit daripada C ++. Hanya berbeda. Saya menemukan penulisan CustomActions dalam Javascript menjadi super mudah, jauh lebih mudah daripada menggunakan C ++. Lebih cepat. Dan sama andal.
Hanya ada satu kelemahan: Javascript CustomActions dapat diekstraksi melalui Orca, sedangkan C / C ++ CA akan membutuhkan rekayasa balik. Jika Anda menganggap sihir pemasang Anda sebagai properti intelektual yang dilindungi, Anda harus menghindari skrip.
Jika Anda menggunakan skrip, Anda hanya perlu mulai dengan beberapa struktur. Inilah beberapa untuk Anda mulai.
Kode Javascript "boilerplate" untuk CustomAction:
//
// CustomActions.js
//
// Template for WIX Custom Actions written in Javascript.
//
//
// Mon, 23 Nov 2009 10:54
//
// ===================================================================
// http://msdn.microsoft.com/en-us/library/sfw6660x(VS.85).aspx
var Buttons = {
OkOnly : 0,
OkCancel : 1,
AbortRetryIgnore : 2,
YesNoCancel : 3
};
var Icons = {
Critical : 16,
Question : 32,
Exclamation : 48,
Information : 64
};
var MsgKind = {
Error : 0x01000000,
Warning : 0x02000000,
User : 0x03000000,
Log : 0x04000000
};
// http://msdn.microsoft.com/en-us/library/aa371254(VS.85).aspx
var MsiActionStatus = {
None : 0,
Ok : 1, // success
Cancel : 2,
Abort : 3,
Retry : 4, // aka suspend?
Ignore : 5 // skip remaining actions; this is not an error.
};
function MyCustomActionInJavascript_CA() {
try {
LogMessage("Hello from MyCustomActionInJavascript");
// ...do work here...
LogMessage("Goodbye from MyCustomActionInJavascript");
}
catch (exc1) {
Session.Property("CA_EXCEPTION") = exc1.message ;
LogException(exc1);
return MsiActionStatus.Abort;
}
return MsiActionStatus.Ok;
}
// Pop a message box. also spool a message into the MSI log, if it is enabled.
function LogException(exc) {
var record = Session.Installer.CreateRecord(0);
record.StringData(0) = "CustomAction: Exception: 0x" + decimalToHexString(exc.number) + " : " + exc.message;
Session.Message(MsgKind.Error + Icons.Critical + Buttons.btnOkOnly, record);
}
// spool an informational message into the MSI log, if it is enabled.
function LogMessage(msg) {
var record = Session.Installer.CreateRecord(0);
record.StringData(0) = "CustomAction:: " + msg;
Session.Message(MsgKind.Log, record);
}
// http://msdn.microsoft.com/en-us/library/d5fk67ky(VS.85).aspx
var WindowStyle = {
Hidden : 0,
Minimized : 1,
Maximized : 2
};
// http://msdn.microsoft.com/en-us/library/314cz14s(v=VS.85).aspx
var OpenMode = {
ForReading : 1,
ForWriting : 2,
ForAppending : 8
};
// http://msdn.microsoft.com/en-us/library/a72y2t1c(v=VS.85).aspx
var SpecialFolders = {
WindowsFolder : 0,
SystemFolder : 1,
TemporaryFolder : 2
};
// Run a command via cmd.exe from within the MSI
function RunCmd(command)
{
var wshell = new ActiveXObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var tmpdir = fso.GetSpecialFolder(SpecialFolders.TemporaryFolder);
var tmpFileName = fso.BuildPath(tmpdir, fso.GetTempName());
LogMessage("shell.Run("+command+")");
// use cmd.exe to redirect the output
var rc = wshell.Run("%comspec% /c " + command + "> " + tmpFileName, WindowStyle.Hidden, true);
LogMessage("shell.Run rc = " + rc);
// here, optionally parse the output of the command
if (parseOutput) {
var textStream = fso.OpenTextFile(tmpFileName, OpenMode.ForReading);
while (!textStream.AtEndOfStream) {
var oneLine = textStream.ReadLine();
var line = ParseOneLine(oneLine);
...
}
textStream.Close();
}
if (deleteOutput) {
fso.DeleteFile(tmpFileName);
}
return {
rc : rc,
outputfile : (deleteOutput) ? null : tmpFileName
};
}
Lalu, daftarkan tindakan khusus dengan sesuatu seperti ini:
<Fragment>
<Binary Id="IisScript_CA" SourceFile="CustomActions.js" />
<CustomAction Id="CA.MyCustomAction"
BinaryKey="IisScript_CA"
JScriptCall="MyCustomActionInJavascript_CA"
Execute="immediate"
Return="check" />
</Fragmemt>
Anda dapat, tentu saja, menyisipkan fungsi Javascript sebanyak yang Anda suka, untuk beberapa tindakan kustom. Salah satu contoh: Saya menggunakan Javascript untuk melakukan kueri WMI pada IIS, untuk mendapatkan daftar situs web yang ada, di mana filter ISAPI dapat diinstal. Daftar ini kemudian digunakan untuk mengisi kotak daftar yang ditampilkan kemudian dalam urutan UI. Semua sangat mudah.
Pada IIS7, tidak ada penyedia WMI untuk IIS, jadi saya menggunakan shell.Run()
pendekatan untuk memanggil appcmd.exe untuk melakukan pekerjaan. Mudah.
Pertanyaan terkait: Tentang Javascript CustomActions