カスタム動作で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"