Calling WaitForSingleObject from C#

余生颓废 提交于 2020-01-23 17:15:49

问题


I am trying to call WaitForSingleObject method from C#, as documented here:

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

In order to call this function I need to create a Handle, or I need to get a Handle of type IntPtr, how can it be done?

I've tried this function that I found: 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);

Or for instance, when I am getting handle from console:

IntPtr handle = Process.GetCurrentProcess().MainWindowHandle;

It throws a DllNotFoundException.

What's the issue here?

I need it in order to run the process with this function call, and to take a dump form its process, for my ClrMd library learning.

Any help will be appreciated.

Code sample:

  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;

回答1:


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

OK, so what about new ManualResetEvent(false).WaitOne()? This should show up in the dump file. And it's reliable.

Just picking any existing handle is not reliable because it might be signaled or be destroyed at any time. Or, you might change its state by waiting. There is no need, a ManualResetEvent can create you a fresh handle.




回答2:


I would not go through WinApi to get this from C#: you have EventWaitHandler and other synchronization objects in C#, use them:

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

you can use wh.SafeWaitHandle if you really need to interop with WinApi

Also I suspect Process.GetCurrentProcess().MainWindowHandle cannot work in a Console Application, that has not any window at all




回答3:


My mistake I've posted WaitForMultipleObjects instead of WaitForSingleObject, the main issue was that WaitForSingleObject stayed with DllImport("coredll.dll"...) I don't know where did I found it but I did...

Sorry for the confusion



来源:https://stackoverflow.com/questions/33718217/calling-waitforsingleobject-from-c-sharp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!