从 C# 调用 WaitForSingleObject

Calling WaitForSingleObject from C#

我正在尝试从 C# 调用 WaitForSingleObject 方法,如此处所述:

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

为了调用这个函数我需要创建一个Handle,或者我需要得到一个IntPtr类型的Handle,如何实现?

我已经尝试过我发现的这个功能: http://www.pinvoke.net/default.aspx/kernel32.WaitForSingleObject

[DllImport("coredll.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Auto)]
    public static extern IntPtr CreateEvent(HANDLE lpEventAttributes, [In, MarshalAs(UnmanagedType.Bool)] bool bManualReset, [In, MarshalAs(UnmanagedType.Bool)] bool bIntialState, [In, MarshalAs(UnmanagedType.BStr)] string lpName);

或者例如,当我从控制台获取句柄时:

IntPtr handle = Process.GetCurrentProcess().MainWindowHandle;

它抛出 DllNotFoundException。

这里有什么问题?

我需要它来 运行 这个函数调用的过程,并从它的过程中获取一个转储,用于我的 ClrMd 库学习。

任何帮助将不胜感激。

代码示例:

  static void Main(string[] args)
    {
         var autoEvent = new AutoResetEvent(false);

         //this is where I get the DllNotFoundException
         WaitForSingleObject(autoEvent.Handle, WAIT_TIMEOUT );
    }


    [DllImport("kernel32.dll")]
    static extern uint WaitForMultipleObjects(uint nCount, IntPtr[] lpHandles, bool bWaitAll, uint dwMilliseconds);

public const Int32 WAIT_TIMEOUT = 0x102;

我不会通过 WinApi 从 C# 获取此信息:您在 C# 中有 EventWaitHandler 和其他同步对象,请使用它们:

WaitHandle wh = new EventWaitHandler();
//do whatever you need
...
WaitHandler.WaitOne(wh); // equivalent to WaitForSingleObject in WinApi

如果你真的需要与 WinApi 互操作,你可以使用 wh.SafeWaitHandle

我还怀疑 Process.GetCurrentProcess().MainWindowHandle 无法在控制台应用程序中工作,它根本没有任何 window

我的错误是我发布了 WaitForMultipleObjects 而不是 WaitForSingleObject,主要问题是 WaitForSingleObject 留在 DllImport("coredll.dll"...) 我不知道我在哪里找到它但我找到了.. .

抱歉造成混淆

I want to call native method (WaitForMultipleObjects) which waits for some handle (don't really mind which one), then I want to see it on thread stack using ClrMd library, from dump file

好的,那么 new ManualResetEvent(false).WaitOne() 呢?这应该显示在转储文件中。而且靠谱。

仅仅选择任何现有句柄是不可靠的,因为它可能随时发出信号或被销毁。或者,您可以通过等待来更改其状态。没必要,一个ManualResetEvent就可以为你打造一个新鲜的句柄