.NET 1.1 でインストーラでCLRからネイティブにコードをコンパイル

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