从C#调用WaitForSingleObject

时间:2015-11-15 09:32:33

标签: c# windows multithreading clrmd

我试图从C#调用WaitForSingleObject方法,如下所示:

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

为了调用这个函数,我需要创建一个Handle,或者我需要得到一个IntPtr类型的句柄,怎么做呢?

我尝试过这个功能,我找到了: 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;

3 个答案:

答案 0 :(得分:1)

我不会通过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无法在控制台应用程序中工作,它根本没有任何窗口

答案 1 :(得分:1)

  

我想调用等待一些句柄的本机方法(WaitForMultipleObjects)(不要介意哪一个),然后我想在使用ClrMd库的线程堆栈中看到它,来自转储文件

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

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

答案 2 :(得分:0)

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

对不起有困惑