カスタム動作でngenを呼び出す。インストーラクラスを作成し下記を定義する。
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"