.Net CCW нет событий с без регистрации COM! - PullRequest
2 голосов
/ 15 января 2009

У меня есть COM Callable Wrapper, который я использую из программы VB6, но программа не будет получать события COM, если не зарегистрировано CCW. В противном случае CCW работает нормально, просто нет событий, пока я не удалю файл манифеста программы и зарегистрирую CCW, используя "regasm / tlb / codebase theccw.dll". Это в WinXP SP3.

В чем может быть проблема?

Возможно, мой CCW создан неправильно для использования в качестве объекта VB6 с "ранней привязкой". Вот мои декларации:

[ComVisible(false)]
public delegate void AnEventDelegate(int arg1);

[
ComVisible(true),
GuidAttribute("XXXX-XXXX-XXXX-XXXX"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)
]
public interface IComEvents
{
    void AnEvent(int arg1);
}

[
ComVisible(true),
Guid("YYYY-YYYY-YYYY-YYYY"),
ClassInterface(ClassInterfaceType.None), 
ComSourceInterfaces(typeof(IComEvents))
]
public class TheComClass: IComContract
{
    public TheComClass(){}

    // Implicit implementation of IComContract.
    // Implicit implementation of IComEvents.
    // 
    // eg. public event AnEventDelegate AnEvent;
}

[
ComVisible(true),
Guid("ZZZZ-ZZZZ-ZZZZ-ZZZZ")
]
public interface IComContract
{
    [ComVisible(true)]
    string AProp{ get; set; }

    [ComVisible(true)]
    void AMethod();
}

Одна вещь, которую я только что понял. У меня нет атрибутов [ComVisible (true)] в моих публичных объявлениях событий внутри TheComClass. Я не думаю, что это проблема, потому что я получаю события, когда вещь зарегистрирована, но посмотрим ...

Ответы [ 3 ]

1 голос
/ 07 ноября 2009

У меня была такая же проблема, и я понял, как ее исправить.

Сделайте ваш класс производным от System.Windows.Forms.UserControl.

Я получил написанный на C # COM-сервер для использования событий из VB6, даже с COM без регистрации.

Очевидно, UserControl реализует IOleObject, что требуется в некоторых случаях.

1 голос
/ 12 марта 2010

Единственный ответ, который я нашел, это то, что это не работает, и я должен зарегистрировать CCW.

1 голос
/ 15 января 2009

В COM события не имеют ранней привязки. Там, где события в .NET - это просто специализированное использование делегатов и, в конечном счете, просто вызовы функций, события COM гораздо более сложны.

Вам понадобится компонент, зарегистрированный для работы событий.

...