Интерфейс
__ является частью набора языковых расширений (называемых «атрибутами»), представленных в Visual Studio 2002. Цель заключалась в том, чтобы иметь возможность напрямую определять исходный код C ++, что вы обычно определяете в MIDL, и облегчать использование ATL.автоматически создавая атрибуты "grok".
Когда вы собираете исходный код C ++ без / clr и используете tlbimp для импорта сгенерированной библиотеки типов, IRow определяется в сборке взаимодействия, сгенерированной tlbimp.Его определение полностью основано на библиотеке типов COM, созданной с использованием __interface;то есть это обычный интерфейс .NET с атрибутом ComImport.
Когда вы создаете исходный код C ++ с помощью / clr, компилятор C ++ генерирует метаданные .NET для IRow, чтобы обозначить, что это собственный тип, поскольку он остается интерфейсом COM даже при применении / clr.Чтобы правильно использовать IRow из C #, вы должны либо продолжать использовать IRow из сборки взаимодействия, созданной с помощью tlbimp (или вручную), либо преобразовать IRow (и классы, которые его реализуют) в типы .NET, используя C ++ / CLI.В качестве альтернативы, вы можете определить некоторые классы-обертки в C ++ / CLI, которые напрямую используют типы COM, но я не вижу большого преимущества в этом.
Вот как может выглядеть интерфейс и разработчик в C ++/ CLI:
public interface class IRow
{
System::Object^ Item(int index);
};
public ref class ImplementedRow : public IRow
{
public:
System::Object^ Item(int index) { return nullptr; }
};
Я подозреваю, что это не может быть тривиальной перепиской для ваших существующих объектов COM, поэтому я, вероятно, просто придерживаюсь COM-взаимодействия, если у вас нет веских причин не делать этого.