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