Sử dụng Javascript CustomActions vì chúng rất dễ
Mọi người đã nói rằng Javascript là điều sai khi sử dụng cho MSI CustomActions . Lý do đưa ra: khó gỡ lỗi, khó làm cho nó đáng tin cậy. Tôi không đồng ý. Không khó để gỡ lỗi, chắc chắn không khó hơn C ++. Nó chỉ khác nhau. Tôi thấy việc viết CustomActions trong Javascript là siêu dễ, dễ hơn nhiều so với sử dụng C ++. Nhanh hơn nhiều. Và cũng đáng tin cậy.
Chỉ có một nhược điểm: Javascript CustomActions có thể được trích xuất thông qua Orca, trong khi đó C / C ++ CA sẽ yêu cầu kỹ thuật đảo ngược. Nếu bạn coi phép thuật trình cài đặt của mình là tài sản trí tuệ được bảo vệ, bạn sẽ muốn tránh tập lệnh.
Nếu bạn sử dụng tập lệnh, bạn chỉ cần bắt đầu với một số cấu trúc. Đây là một số để giúp bạn bắt đầu.
Mã "soạn sẵn" Javascript cho 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
};
}
Sau đó, đăng ký hành động tùy chỉnh với một cái gì đó như thế này:
<Fragment>
<Binary Id="IisScript_CA" SourceFile="CustomActions.js" />
<CustomAction Id="CA.MyCustomAction"
BinaryKey="IisScript_CA"
JScriptCall="MyCustomActionInJavascript_CA"
Execute="immediate"
Return="check" />
</Fragmemt>
Tất nhiên, bạn có thể chèn bao nhiêu chức năng Javascript tùy thích, cho nhiều hành động tùy chỉnh. Một ví dụ: Tôi đã sử dụng Javascript để thực hiện truy vấn WMI trên IIS, để lấy danh sách các trang web hiện có, có thể cài đặt bộ lọc ISAPI. Danh sách này sau đó được sử dụng để điền vào hộp danh sách được hiển thị sau trong chuỗi UI. Tất cả đều rất dễ dàng.
Trên IIS7, không có nhà cung cấp WMI cho IIS, vì vậy tôi đã sử dụng shell.Run()
cách tiếp cận để gọi appcmd.exe để thực hiện công việc. Dễ dàng.
Câu hỏi liên quan: Giới thiệu về CustomActions Javascript