1

我正在尝试从 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;
4

3 回答 3

2

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

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

wh.SafeWaitHandle如果您确实需要与 WinApi 互操作,您可以使用

我也怀疑Process.GetCurrentProcess().MainWindowHandle不能在控制台应用程序中工作,它根本没有任何窗口

于 2015-11-15T10:00:08.627 回答
1

我想调用等待某个句柄的本机方法(WaitForMultipleObjects)(不介意哪个句柄),然后我想从转储文件中使用 ClrMd 库在线程堆栈上查看它

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

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

于 2015-11-15T11:24:00.277 回答
0

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

对困惑感到抱歉

于 2015-11-15T11:17:51.907 回答