使用指针参数(WCT)从C#调用C ++方法

我不熟悉从C#调用C ++方法的概念。

假设我想从C#调用C ++函数GetThreadWaitChain

https://msdn.microsoft.com/en-us/library/windows/desktop/ms679364(v=vs.85).aspx https://msdn.microsoft.com/en-us/library/windows/desktop/ ms681623(v = vs.85)的.aspx

我已经构建了一个调用所依赖的其他类型的模型:

 [DllImport("Advapi32.dll")] public static extern void CloseThreadWaitChainSession(IntPtr WctHandle); [DllImport("Advapi32.dll")] public static extern HANDLE OpenThreadWaitChainSession(UInt32 Flags, UInt32 callback); [DllImport("Advapi32.dll")] public static extern BOOL GetThreadWaitChain( IntPtr WctHandle, UInt32 Context, UInt32 flags, UInt32 ThreadId, WAITCHAIN_NODE_INFO NodeInfoArray, UInt32 IsCycle ); [StructLayout(LayoutKind.Sequential)] public struct WAITCHAIN_NODE_INFO { public UInt32 ObjectType; public UInt32 ObjectStatus; public struct LockObject { string ObjectName; UInt64 Timeout; UInt32 Alertable; } public struct ThreadObject { UInt32 ProcessId; UInt32 ThreadId; UInt32 WaitTime; UInt32 ContextSwitches; } } 

如何调用GetThreadWaitChain函数? 它接受指向WAITCHAIN_NODE_INFO结构的指针…

目前,这就是我想出来调用该函数的方式(显然它不起作用):

  void CollectWaitInformation(int threadId) { var wctHandle = OpenThreadWaitChainSession(0, 0); WAITCHAIN_NODE_INFO info = new WAITCHAIN_NODE_INFO(); var result = GetThreadWaitChain(wctHandle, 0, GetThreadWaitChainFlags.WCT_OUT_OF_PROC_COM_FLAG, threadID, info , 0); } 

我的C ++类型是否正确映射到C#类型?

GetThreadWaitChain函数原型不正确。 它应该是:

 [DllImport("advapi32.dll", SetLastError = true)] public static extern bool GetThreadWaitChain( IntPtr WctHandle, IntPtr Context, UInt32 Flags, int ThreadId, ref int NodeCount, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)] [In, Out] WAITCHAIN_NODE_INFO[] NodeInfoArray, out int IsCycle ); 

首次调用时,分配WAITCHAIN_NODE_INFO数组。

 WAITCHAIN_NODE_INFO[] data = new WAITCHAIN_NODE_INFO[16];