プロセス A の多数のインスタンスがプロセス B の 1 つのインスタンスに依存するアプリケーションを開発しています。プロセス A のインスタンスの 1 つがプロセス B を開始し、A のすべてのインスタンスが実行できるようにするという考え方です。これを使って。A のインスタンスはサード パーティのプロセスでホストされており、予測できない時点で (プロセス ツリーを強制終了することによって) 取り壊される可能性があります。したがって、プロセス B がプロセス A のどのインスタンスの子でもないことが重要です。
PInvoke を使用して CreateProcess を呼び出し、作成フラグで DetachedProcess (0x08) を指定してこれを実行しようとしましたが、うまくいきませんでした (以下のコードを参照してください)。
[DllImport("kernel32.dll")]
private static extern bool CreateProcess(string lpApplicationName, string lpCommandLine, IntPtr lpProcessAttributes, IntPtr lpThreadAttributes, bool bInheritHandles, uint dwCreationFlags, IntPtr lpEnvironment, string lpCurrentDirectory, [In] ref StartupInfo lpStartupInfo, out ProcessInformation lpProcessInformation);
public Process LaunchProcess(Path executablePath, string args)
{
StartupInfo sInfo = new StartupInfo();
const uint creationFlags = (uint)(CreationFlags.CreateNoWindow | CreationFlags.DetachedProcess);
ProcessInformation pInfo;
bool success = CreateProcess(executablePath.ToString(), args, IntPtr.Zero, IntPtr.Zero, false, creationFlags, IntPtr.Zero, executablePath.GetFolderPath().ToString(), ref sInfo, out pInfo);
if (!success)
{
throw new Win32Exception();
}
return Process.GetProcessById(pInfo.dwProcessId);
}
How to create a process that is not a child of it's creation process? の記事も読みました。、中間プロセスを使用して新しいプロセスを開始することを提案しましたが、プロセス B の単一のインスタンスのみが開始されるようにするための同期が複雑になるため、このアプローチには熱心ではありません。
これを達成するためのより良い方法を知っている人はいますか?