2015-11-15 55 views
0

Я пытаюсь вызвать метод WaitForSingleObject из C#, как описано здесь:Вызов WaitForSingleObject из C#

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; 
+2

Вопрос гораздо лучше: почему вы хотите это сделать (текущее объяснение - это путаница, если не сказать больше). Единственная причина - если вы взаимодействуете с существующей библиотекой, но в этом случае у вас, очевидно, уже есть дескриптор. Во всех других ситуациях существуют классы C#, которые лучше использовать. В любом случае, если нет такой вещи, как «coredll».dll ", это все в kernel32, так как в документации написано – Voo

+0

Ну, единственный ответ, который я могу дать вам на тему« почему », просто потому, что я пытаюсь разобраться, я пытаюсь понять, почему он не работает ... –

+1

Когда я использую Process.GetCurrentProcess(). Handl - я получаю Невозможно загрузить DLL 'coredll.dll': указанный модуль не найден. (Исключение из HRESULT: 0x8007007E) –

ответ

1

Я хочу назвать нативный метод (WaitForMultipleObjects), который ждет каких-то ручек (не возражает, который один), то я хочу увидеть его на стеке потока с помощью ClrMd библиотека, из файла дампа

ОК, так что насчет new ManualResetEvent(false).WaitOne()? Это должно отображаться в файле дампа. И это надёжно.

Простое обнаружение любой существующей ручки не является надежным, поскольку оно может быть сигнализировано или уничтожено в любое время. Или вы можете изменить свое состояние, ожидая. Нет необходимости, ManualResetEvent может создать новую ручку.

+0

Я попробую, спасибо :) –

1

Я бы не пройти через WinApi, чтобы получить это из C#: у вас есть EventWaitHandler и другие объекты синхронизации в C#, используйте их:

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

вы можете использовать wh.SafeWaitHandle если вам действительно нужно взаимодействовать с WinApi

Также я подозреваю, что Process.GetCurrentProcess().MainWindowHandle не может работать в консольном приложении, которое не имеет никакого окна в al l

+0

Я не пытаюсь найти лучшее решение, я пытаюсь найти, почему он не работает. Есть ли какая-либо другая действительная ручка, которую я могу передать функции WaitForSingleObject? Возможно, Process.GetCurrentProcess(). Handle? –

+0

попробуйте использовать wh.SafeWaitHandle как HANDLE, чтобы перейти к WaitForSingleObject. Конечно, вам нужна ручка объекта синхронизации, а не окна. –

+0

По-прежнему не удается загрузить DLL 'coredll.dll', я использовал AutoResetEvent в качестве объекта синхронизации. Может быть, есть что-то, чего я пропустил. –

0

Моя ошибка Я опубликовал WaitForMultipleObjects вместо WaitForSingleObject, основная проблема заключалась в том, что WaitForSingleObject остался с DllImport («coredll.dll» ...) Я не знаю, где я его нашел, но я это сделал. .

Извините за сумбур

Смежные вопросы