/// <summary> /// プロセスでシステムを起動させる。 /// </summary> /// <param name="clrVersion">CLRのバージョン</param> /// <param name="assemblyStep">踏み台アセンブリへのパス</param> /// <param name="processId">プロセスID。</param> /// <param name="initializeThreadWindowHandle">初期化を実行させるスレッドに属するウィンドウのハンドル。</param> /// <param name="start">開始処理</param> /// <returns>システムコントローラー。</returns> static SystemController StartInApp(string clrVersion, string assemblyStep, int processId, IntPtr initializeThreadWindowHandle, ExecuteStart start) { SystemStartResponseReciever reciever = new SystemStartResponseReciever(); IntPtr recieveWindowHandle = reciever.Start(processId); //開始 start(CreateStartupInfo(clrVersion, assemblyStep, recieveWindowHandle, initializeThreadWindowHandle)); //受信スレッドの終了待ち(返信待ち) long errNo = 0; IntPtr systemControlWindowInAppHandle = reciever.WaitForCompletion(ref errNo); //nullなら失敗 if (systemControlWindowInAppHandle == IntPtr.Zero) { switch (errNo) { case ERR_UNPREDICATABLE_CLR_VERSION: throw new FriendlyOperationException(ResourcesLocal.Instance.ErrorUnpredicatableClrVersion); default: throw new FriendlyOperationException(ResourcesLocal.Instance.ErrorProcessAcess); } } //システムコントロールウィンドウのハンドルを返す Debug.Trace("InitializeFriendly Success."); return(new SystemController(systemControlWindowInAppHandle)); }
/// <summary> /// デフォルト以外のAppDomainで起動。 /// </summary> /// <param name="processId">プロセスID。</param> /// <param name="initializeThreadWindowHandle">初期化を実行させるスレッドに属するウィンドウのハンドル。</param> /// <param name="start">開始処理</param> /// <returns>システムコントローラー。</returns> internal static SystemController StartInOtherAppDomain(int processId, IntPtr initializeThreadWindowHandle, ExecuteStart start) { return(StartInApp("nouse", "nouse", processId, initializeThreadWindowHandle, start)); }