Создание событий Win32 из С#

Я хотел бы создать ядро ​​​​(также известное как именованные события) из С#.

Должен ли я взаимодействовать со службами и обертывать собственную функцию CreateEvent или уже существует класс .NET, который выполняет эту работу?

Функция, которую мне нужно запустить, должна быть примерно такой: hEvent = CreateEvent(NULL, false, false, "MyCSHARPEvent");

Это должно уведомить все процедуры, которые проверяют MyCSHARPEvent, о событии.

Если есть необходимость обернуть функцию, как мне перевести структуру SECURITY_ATTRIBUTES с C# на win32?


person ofer    schedule 15.01.2009    source источник


Ответы (2)


Взгляните на класс EventWaitHandle. Он поддерживается начиная с .Net 2.0 и позволяет создавать именованные события. Он также поддерживает настройку безопасности событий в зависимости от того, какой конструктор вы используете.

person Stu Mackellar    schedule 15.01.2009

Если вы все еще хотите использовать взаимодействие, вы можете определить функцию следующим образом:

[DllImport("kernel32.dll")]
static extern IntPtr CreateEvent(IntPtr lpEventAttributes, bool bManualReset, bool bInitialState, string lpName);

и такая структура (возможно, вам придется возиться с атрибутом Pack, чтобы он подходил):

[StructLayout(LayoutKind.Sequential)]
struct SECURITY_ATTRIBUTES{
  public int length;
  public IntPtr securityDesc;
  public bool inherit;
}

Кроме того, вот пример кода, в котором все это собрано вместе.

person scottm    schedule 15.01.2009
comment
Ничего себе - я думал, что только CF был таким искалеченным (он все еще не поддерживает именованные EventWaitHandles). - person ctacke; 15.01.2009
comment
CF 3.5 теперь поддерживает EventWaitHandles. - person Sam; 29.01.2010
comment
Почему так много людей думают, что PInvoke — это .net-решение для всего? - person Dan; 30.03.2013
comment
@ Дэн, ты понимаешь, что отвечаешь на ответ, которому больше 4 лет, верно? - person scottm; 01.04.2013