.Net CCW нет событий с без регистрации COM!
У меня есть 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 ответа
Единственный ответ, который я нашел, - это то, что это не работает, и я должен зарегистрировать CCW.
У меня была такая же проблема, и я понял, как ее исправить.
Сделайте ваш класс производным от System.Windows.Forms.UserControl.
Я получил написанный на C# COM-сервер для использования событий из VB6, даже с COM без регистрации.
Очевидно UserControl реализует IOleObject, который требуется в некоторых случаях.
В COM события не связаны рано. В тех случаях, когда события в.NET являются просто специализированным использованием делегатов и, в конечном счете, являются просто вызовами функций, события COM гораздо более сложны.
Для работы событий вам понадобится компонент, зарегистрированный.