Явное определение интерфейса
В предыдущем разделе мы определили общедоступный управляемый класс ManagedClass, который автоматически был представлен интерфейсом модели компонентных объектов Microsoft (COM), сгенерированным со значением AutoDual (Автодуальный), заданным в атрибуте Classlnterface (ClassInterfaceType::AutoDual). Указанный дуальный интерфейс дал возможность клиенту получать доступ к классу ManagedClass. Это – удобная техника, хотя и несколько необычная, так как не существует способа задать версию для сгенерированного интерфейса, и создается только единственный интерфейс, который может быть в чем-то ограниченным.
Здесь мы рассмотрим альтернативу значению AutoDual (Автодуальный), которая позволит создавать версии интерфейсов, но потребует точного определения интерфейса в программе. Для этого мы зададим значение None (Никакой) для атрибута Classlnterface (ClassInterfaceType::None). Следующая программа демонстрирует управляемый компонент с явным образом описанными интерфейсом и глобально уникальными идентификаторами соклассов.
//SomeManagedClass.срр fusing <mscorlib.dll> using namespace System; // использование пространства имен Система; using namespace System::Runtime::InteropServices; // использование пространства имен // Система::Время выполнения::InteropServices; namespace SomeManagedClass // пространство имен SomeManagedClass { // Интерфейс модели компонентных объектов Microsoft (COM) [Guid("C3894DE3-F5D6-46fe-84C7-C6DDOE801C86")] public _gc _interface IManagedClass // сборщик мусора – интерфейс IManagedClass { //public: virtual int AddEmUp(int i, int j) = 0; // виртуальный }; //сокласс (coclass) [Guad("8D48DE87-048E-466e-95C3-06F3C21FCEAA"), Classlnterface(ClassInterfaceType::None)] p die _gc class ManagedClass: public IManagedClass { public: ManagedClass () // общедоступный заданный //по умолчанию конструктор { } int AddEmUp(int i, int ]) { return i + ]; } }; }
Следующий код (который является программой на неуправляемом C++, созданной в Visual C++ 6.0) представляет собой клиент на основе модели компонентных объектов Microsoft (COM), который работает с описанным выше управляемым компонентом. И снова глобально уникальные идентификаторы жестко запрограммированы, а не генерируются оператором импорта библиотеки типов. Таким образом, в этом примере мы не используем утилиту Tlsexp.exe для генерации библиотеки типов.