SECURITY_ATTRIBUTES何时发生变化?为什么?

我有一些代码使用P / Invoke来启动进程并捕获标准输出。 (我们为什么使用P / Invoke而不是System.Diagnostics.Process这样做的故事是漫长而复杂的;足以说它是一个要求。)它已经在重载下生产了近一年,并且测试运动它一直都过去了。

今天早上虽然我进行了测试,但他们失败了。 我不能确定我上次在今天早上(2014年5月15日)之前进行的测试,但我相信这是2014年4月24日。 测试通过了,但今天早上失败了。 我收到了“PInvokeStackImbalance”错误消息,所以我做了一些研究,最终意识到extern方法使用的其中一个结构的签名(在这个例子中为CreatePipe )是不正确的。 我改变了,测试又开始了。

我很高兴找到了解决方案,但我很关心部署。 为什么结构的签名会发生变化? 我没有升级我的操作系统或任何东西 – 我在4/24运行Windows 7 x64,我现在仍在运行它。 (部署环境是Windows Server 2012.)从那时起,我已经安装(并卸载)了一些应用程序,但它们是轻量级的第三方工具,而不是Microsoft或系统组件。 我假设Windows Update修复程序是负责任的,但我无法弄清楚哪一个。

要清楚,在我自己的代码中,我改变的是:

  [StructLayout(LayoutKind.Sequential)] public struct SECURITY_ATTRIBUTES { public UInt32 nLength; public IntPtr lpSecurityDescriptor; public bool bInheritHandle; } 

对此:

  [StructLayout(LayoutKind.Sequential)] internal class SECURITY_ATTRIBUTES { public int nLength = 12; public IntPtr lpSecurityDescriptor = IntPtr.Zero; public bool bInheritHandle; } 

我需要确保在部署到生产环境时,为使代码在我的机器上运行所做的更改不会破坏应用程序。 有谁知道如何识别需要更改的内容以及如何确定生产环境是否需要更改?

编辑:

以下是打开标准输出管道的代码:

  private PipeInfo CreatePipe() { PipeInfo pipeInfo = new PipeInfo(); SafeFileHandle safeFileHandle = null; try { Native.SECURITY_ATTRIBUTES pipeAttributes = new Native.SECURITY_ATTRIBUTES(); pipeAttributes.bInheritHandle = true; if (!Native.CreatePipe(out safeFileHandle, out pipeInfo.ChildHandle, pipeAttributes, 0) || safeFileHandle.IsInvalid || pipeInfo.ChildHandle.IsInvalid) { throw new Win32Exception(); } if (!Native.DuplicateHandle(new HandleRef(this, Native.GetCurrentProcess()), safeFileHandle, new HandleRef(this, Native.GetCurrentProcess()), out pipeInfo.ParentHandle, 0, false, 2)) { throw new Win32Exception(); } } finally { if (safeFileHandle != null && !safeFileHandle.IsInvalid) { safeFileHandle.Close(); } } return pipeInfo; } 

我不能完全赞同这个代码,我主要是从.NET Reference Source中提取它

只是要明确时间表:

  • 2013年5月 – 使用第一版SECURITY_ATTRIBUTES编写CreatePipe代码
  • 2013年6月 – 部署; 从那以后,代码一直在成功运行
  • 2014年4月 – 没有任何更改,代码开始抛出堆栈不平衡错误
  • 2014年5月 – 我更改为SECURITY_ATTRIBUTES的第二个版本,错误消失了