18 enum JobObjectInfoType
20 AssociateCompletionPortInformation = 7,
21 BasicLimitInformation = 2,
22 BasicUIRestrictions = 4,
23 EndOfJobTimeInformation = 6,
24 ExtendedLimitInformation = 9,
25 SecurityLimitInformation = 5,
29 [StructLayout(LayoutKind.Sequential)]
30 struct JOBOBJECT_BASIC_LIMIT_INFORMATION
32 public Int64 PerProcessUserTimeLimit;
33 public Int64 PerJobUserTimeLimit;
34 public JOBOBJECTLIMIT LimitFlags;
35 public UIntPtr MinimumWorkingSetSize;
36 public UIntPtr MaximumWorkingSetSize;
37 public UInt32 ActiveProcessLimit;
38 public Int64 Affinity;
39 public UInt32 PriorityClass;
40 public UInt32 SchedulingClass;
44 enum JOBOBJECTLIMIT : uint
46 JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = 0x2000
49 [StructLayout(LayoutKind.Sequential)]
52 public UInt64 ReadOperationCount;
53 public UInt64 WriteOperationCount;
54 public UInt64 OtherOperationCount;
55 public UInt64 ReadTransferCount;
56 public UInt64 WriteTransferCount;
57 public UInt64 OtherTransferCount;
60 [StructLayout(LayoutKind.Sequential)]
61 struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION
63 public JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;
64 public IO_COUNTERS IoInfo;
65 public UIntPtr ProcessMemoryLimit;
66 public UIntPtr JobMemoryLimit;
67 public UIntPtr PeakProcessMemoryUsed;
68 public UIntPtr PeakJobMemoryUsed;
78 if (s_jobHandle != IntPtr.Zero)
80 bool success = AssignProcessToJobObject(s_jobHandle, process.Handle);
81 if (!success && !process.HasExited)
82 throw new Win32Exception();
93 if (Environment.OSVersion.Version <
new Version(6, 2))
99 string jobName =
"ChildProcessTracker" + Process.GetCurrentProcess().Id;
100 s_jobHandle = CreateJobObject(IntPtr.Zero, jobName);
102 var info =
new JOBOBJECT_BASIC_LIMIT_INFORMATION();
107 info.LimitFlags = JOBOBJECTLIMIT.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
109 var extendedInfo =
new JOBOBJECT_EXTENDED_LIMIT_INFORMATION();
110 extendedInfo.BasicLimitInformation = info;
112 int length = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION));
113 IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length);
116 Marshal.StructureToPtr(extendedInfo, extendedInfoPtr,
false);
118 if (!SetInformationJobObject(s_jobHandle, JobObjectInfoType.ExtendedLimitInformation,
119 extendedInfoPtr, (uint)length))
121 throw new Win32Exception();
126 Marshal.FreeHGlobal(extendedInfoPtr);
130 [DllImport(
"kernel32.dll", CharSet = CharSet.Unicode)]
131 static extern IntPtr CreateJobObject(IntPtr lpJobAttributes,
string name);
133 [DllImport(
"kernel32.dll")]
134 static extern bool SetInformationJobObject(IntPtr job, JobObjectInfoType infoType,
135 IntPtr lpJobObjectInfo, uint cbJobObjectInfoLength);
137 [DllImport(
"kernel32.dll", SetLastError =
true)]
138 static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process);
143 private static readonly IntPtr s_jobHandle;