当父NT服务被杀/崩溃时杀死子进程

我有一个Windows NT服务和第三方exe,我想作为NT服务的子进程运行,这样一旦我的NT服务进程崩溃,这个子进程也被杀死

为此,我找到了在父进程被终止时使用Kill子进程执行此操作的方法

我试图实现它,并使用普通的父进程正常工作,但当我在我的NT服务中做同样的事情,因为父SetInformationJobObject方法返回false和错误代码0的exception

例外:_COMPlusExceptionCode = -532462766

正常进程和导致此exception的NT服务进程有什么区别?

我正在使用Win2k8 R2 Server机器和C#

[EDIT1]exception:GenericParameterAttributes =’((System.Reflection.RuntimeConstructorInfo)(ex._exceptionMethod))。ReflectedType).GenericParameterAttributes’抛出类型’System.InvalidOperationException’的exception{“”方法只能在类型上调用Type.IsGenericParameter是真的。“}

编辑2:因为在函数定义中使用DLLImport没有将SetLastError设置为true,所以最后一个错误是错误的正确ErrorCode是24表示结构的坏结果,那么应该是什么正确的结构?

编辑3:在我的64位win2k8R2服务器机器的NT Servce的情况下预期的正确长度似乎是144而不是上面的post中定义的112

编辑4:这是否是这样做的唯一方法,做同样的其他选择是什么?

问题在于我使用的结构声明,如父线程被终止时线程杀死子进程中所定义的那样

上述线程中定义的结构对32位应用程序和
我的NT服务是64位应用程序,需要进行一些更改

改变了

  • 首先将SetInformationJobObject的DLL导入更改为

    [DllImport("kernel32.dll", SetLastError = true)] static extern bool SetInformationJobObject(IntPtr hJob, JobObjectInfoType infoType, IntPtr lpJobObjectInfo, uint cbJobObjectInfoLength); 

    因为没有设置SetLastError标志它没有给我正确的错误代码,在得到正确的错误代码之后我才能得到它期望144字节长度的结构

  • 然后将JOBOBJECT_BASIC_LIMIT_INFORMATION和JOBOBJECT_EXTENDED_LIMIT_INFORMATION结构chnage到以下
 [StructLayout(LayoutKind.Sequential)] struct JOBOBJECT_BASIC_LIMIT_INFORMATION { public Int64 PerProcessUserTimeLimit; public Int64 PerJobUserTimeLimit; public Int32 LimitFlags; public UInt64 MinimumWorkingSetSize; public UInt64 MaximumWorkingSetSize; public Int32 ActiveProcessLimit; public Int64 Affinity; public Int32 PriorityClass; public Int32 SchedulingClass; } [StructLayout(LayoutKind.Sequential)] struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION { public JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; public IO_COUNTERS IoInfo; public UInt64 ProcessMemoryLimit; public UInt64 JobMemoryLimit; public UInt64 PeakProcessMemoryUsed; public UInt64 PeakJobMemoryUsed; } 

基本上按照JOBOBJECT_EXTENDED_LIMIT_INFORMATION结构和JOBOBJECT_BASIC_LIMIT_INFORMATION结构,我们应该根据应用程序使用数据类型SIZE_T = UInt64 vs UInt32 DWORD = Int32

更改后,它工作正常。