Явная реализация интерфейса для интерфейсов COM в C # - PullRequest
4 голосов
/ 07 февраля 2012

Некоторое время назад я работал над серьезным рефакторингом старой программы Win32, реализованной с помощью COM, и были различные части, которые были реализованы с помощью C # (.NET).Во время моей работы над этим проектом я наткнулся на страницу Microsoft по программированию COM на C #, в которой рекомендовалось, чтобы классы C # явно реализовывали интерфейсы COM, а не простоту.Я недавно пытался вспомнить почему, и я не мог.Я также не смог найти страницу на сайте MSDN снова.Кто-нибудь может сказать мне, почему Microsoft может порекомендовать это?

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

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

На самом деле делать это совершенно бессмысленно, вы можете (и должны) просто применить атрибут [ClassInterface(ClassInterfaceType.None)] к классу.Это само по себе гарантирует, что реализация не будет представлена, видны только интерфейсы, реализованные классом.Реализация методов интерфейса явно недостаточно хороша.Потому что вы не можете скрыть тот факт, что ваш класс наследует System.Object.Он предоставляет четыре открытых метода Object и помещает ссылку на mscorlib.tlb в вашу библиотеку типов, ссылку, которую настоящий COM-клиент никогда не будет использовать.Это почти всегда будет работать, потому что вероятность того, что компилятор, который использует ваш класс, работает на машине, на которой не установлен .NET, довольно мала.Но, тем не менее, очень отвратительно, это на самом деле не требуется.Только тот компьютер, который использует , нуждается в установке класса.

Только не делайте этого.Объявите интерфейсы, которые вы реализуете, присвойте им атрибут [InterfaceType(ComInterfaceType.InterfaceIsDual)], чтобы они могли использоваться как с ранним, так и с поздним ограничением.И скрыть фактическую реализацию их с помощью [ClassInterface(ClassInterfaceType.None)].Единственный разумный способ.

1 голос
/ 07 февраля 2012

Это старый, но отсюда: http://msdn.microsoft.com/en-us/library/aa288461%28v=VS.71%29.aspx в них явно упоминается реализация интерфейса, чтобы вы могли реализовать несколько интерфейсов с одинаковыми именами членов.

Это также требует, чтобы пользователь вашего класса приводил экземпляр вашего класса к соответствующему интерфейсу.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...