我试图从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;
答案 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" ...)我不知道我在哪里找到了,但我做到了......
对不起有困惑