Как обрабатывать события COM из консольного приложения?

Я использую COM-объект из сторонней библиотеки, которая генерирует периодические события. Когда я использую библиотеку из приложения Winforms, имея объект в качестве члена класса и создавая его в основном потоке формы, все работает. Однако, если я создаю объект из другого потока, я не получаю никакого события.

Я предполагаю, что мне нужен какой-то цикл событий в том же потоке, который использовался для создания объекта.

Мне нужно использовать этот объект из консольного приложения. Думаю, я мог бы использовать Application.DoEvents, но я бы предпочел не включать пространство имен Winforms в консольное приложение.

Как я могу решить эту проблему?

Обновление 3 (2011-06-15): Производитель наконец ответил. Короче говоря, они говорят, что существует некоторая разница между насосом сообщений, созданным Application.Run, и тем, который создается Thread.Join, но они не знают, в чем эта разница.

Я согласен с ними; Было бы очень полезно пролить свет на этот вопрос.

Обновление:

Из комментария Ричарда к ответу mdm:

, если другой компонент является однопоточным и создается из MTA, тогда Windows создаст рабочий поток + окно + перекачивание сообщений и необходимая сортировка.

Пытаясь последовать его совету, я делаю следующее:

Обновление 2:

Я изменил код после ответа Жоао Анджело.

using System;

namespace ConsoleApplication2
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            MyComObjectWrapper wrapper = new MyComObjectWrapper();
        }
    }

    class MyComObjectWrapper
    {
        MyComObject m_Object;
        AutoResetEvent m_Event;

        public MyComObjectWrapper()
        {
            m_Event = new System.Threading.AutoResetEvent(false);

            System.Threading.Thread t = new System.Threading.Thread(() => CreateObject());
            t.SetApartmentState (System.Threading.ApartmentState.STA);
            t.Start();

            Wait();
        }

        void ObjectEvt(/*...*/)
        {
            // ...
        }

        void Wait()
        {
            m_Event.WaitOne();
        }

        void CreateObject()
        {
            m_Object = new MyComObject();
            m_Object.OnEvent += ObjectEvt;

            System.Threading.Thread.CurrentThread.Join();
        }    
    }
}

У меня есть также попробовал вместо этого следующее:

        public MyComObjectWrapper()
        {
            CreateObject();
        }
12
задан raven 15 June 2011 в 16:07
поделиться