从 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
就可以为你打造一个新鲜的句柄
我正在尝试从 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
就可以为你打造一个新鲜的句柄