Общедоступные члены класса, по-видимому, недоступны в VB6 IDE
Я создал сборку.net, которая включает в себя контракт данных для службы WCF (win32). Затем я открыл эти объекты через COM-взаимодействие, чтобы можно было повторно использовать одну и ту же сборку на стороне клиента для вызова службы WCF. У меня есть следующие части для моего проекта:
[служба wcf] <====> { [сборка клиента wcf предоставляется через COM-взаимодействие] + [сборка контрактов данных также предоставляется через com-взаимодействие] } <==> [приложение vb 6]
Один пример класса в контракте данных выглядит следующим образом:
[Guid("00000000-0000-0000-0000-000000000000")]
[ComVisible(true)]
[DataContract]
public sealed class Monkey {
public string name;
};
И, в основном, это работает просто отлично. Я могу скомпилировать сборку.net, которая включает этот класс, зарегистрировать его для взаимодействия COM, обратиться к нему в проекте VB6 и обратиться к службе WCF из клиентского приложения.
Вот странное поведение: он отображает класс Monkey в браузере объектов IDE VB6, но не отображает элементы, такие как Monkey.name.
Я считаю, что это вызвано тем же, что вызывает следующее предупреждение во время компиляции в проекте сборки.net:
Обработка предупреждений экспортера библиотеки типов 'MyCompany.Product.Contracts, MyCompany.Product.API'. Предупреждение: экспортер библиотеки типов обнаружил тип, производный от универсального класса и не помеченный как [ClassInterface(ClassInterfaceType.None)]. Интерфейсы классов не могут быть выставлены для таких типов. Попробуйте пометить тип с помощью [ClassInterface (ClassInterfaceType.None)] и предоставить явный интерфейс в качестве интерфейса по умолчанию для COM с помощью атрибута ComDefaultInterface.
И, наконец, я думаю, что причина как предупреждения, так и странного поведения при разработке клиентского приложения вызвана тем фактом, что я использую автоматически сгенерированную ссылку на службу и клиентский объект, который наследуется от System.ServiceModel.ClientBase<T>
,
Я на правильном пути?
Как я могу решить эту проблему / предупреждение?
1 ответ
Обычный способ решить эту проблему - создать интерфейс IMonkey ComVisible, который реализуется вашим классом.
Результатом будет что-то вроде примера в этом похожем вопросе.