C # компонент событий? - PullRequest
       41

C # компонент событий?

1 голос
/ 17 июля 2009

Я пытаюсь написать компонент C #, который будет представлять события. Компонент должен быть импортирован неуправляемым приложением C ++. В соответствии с несколькими уроками я придумал этот код (для стороны C #):

namespace COMTest
{
[ComVisible(true),
Guid("02271CDF-BDB9-4cfe-B65B-2FA58FF1F64B"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ITestEvents
{
    void OnTest();
}

[ComVisible(true),
Guid("87BA4D3A-868E-4233-A324-30035154F8A4")]
public interface ITest
{
    void RaiseTest();
} // End of ITest

[ComVisible(true),
Guid("410CD174-8933-4f8c-A799-8EE82AF4A9F2"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(ITestEvents))]
public class TestImplimentation : ITest
{
    public TestImplimentation()
    {
    }

    public void RaiseTest()
    {
        if (null != OnTest)
            OnTest();
    }

    public delegate void Test (); //No need to expose this delegate
    public event Test OnTest;
}
}

Теперь мой код на С ++ имеет простое значение:

#import "COMTest.tlb" named_guids raw_interfaces_only

Который генерирует файл tlh. Этот файл содержит все, кроме моего события (OnTest). Что я делаю неправильно?

1 Ответ

3 голосов
/ 17 июля 2009

Мойки COM-событий довольно злы для непосвященных.

Шаги в основном:

  • создать исходящий (исходный) интерфейс
  • Реализация IConnectionPointContainer и Интерфейсы IConnectionPoint, использование это передать реализацию клиента интерфейса источника

Хорошая новость заключается в том, что в пространстве имен взаимодействия есть атрибуты, которые помогут вам сделать это (в основном) автоматически ( ComSourceInterfacesAttribute ). Приличный пример его использования здесь .

...