カスタム動作でngenを呼び出す。インストーラクラスを作成し下記を定義する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public override void Install(IDictionary stateSaver) {
base.Install (stateSaver);
doNgen(getArgument(), false);
}

public override void Uninstall(IDictionary savedState) {
base.Uninstall(savedState);
doNgen(getArgument(), true);
}

private string getArgument() {
string args = this.Context.Parameters\["Args"\];
if (args.Length == 0) {
throw new InstallException("No arguments specified");
}
return args;
}

private void doNgen(string fileName, bool delete) {
const char DOUBLEQUOTE = '\"';
StringBuilder sbArgs = new StringBuilder();
if (delete) {
sbArgs.Append("/delete ");
}
sbArgs.Append(DOUBLEQUOTE);
sbArgs.Append(fileName);
sbArgs.Append(DOUBLEQUOTE);
ProcessStartInfo psi = new ProcessStartInfo(
System.IO.Path.Combine(GetClrInstallationDirectory(), "ngen.exe"), sbArgs.ToString());
psi.WindowStyle = ProcessWindowStyle.Hidden;
try {
Process process = Process.Start(psi);
process.WaitForExit();
} catch(Exception ex) {
throw new InstallException(ex.Message);
}
}

private static string GetClrInstallationDirectory() {
const int MAX_PATH_LEN = 260;
StringBuilder sb = new StringBuilder(MAX_PATH_LEN);
int pathlen = MAX_PATH_LEN;
GetCORSystemDirectory(sb, MAX_PATH_LEN, ref pathlen);
return sb.ToString();
}

あとは、下記としてEXE, DLLファイルを指定した動作を定義する。
CustomActionData: /Args="[TARGETDIR]xxxx.dll"
アンインストール時は
CustomActionData: /Args="xxxx"