Введення в інтерфейс класу
Значення ClassInterfaceType.None запобігає створення інтерфейсу класу при експорті метаданих класу в бібліотеку типів. У попередньому прикладі COM-клієнти можуть отримати доступ до класу LoanApp тільки за допомогою інтерфейсу IExplicit.
Використання інтерфейсу класу є допустимим варіантом для клієнтів зі сценарієм, клієнтів Microsoft Visual Basic 6.0, а також клієнтів з пізнім зв'язуванням, що не кешируєт ідентифікатори DispId членів інтерфейсу. Ідентифікатори DispId визначають члени інтерфейсу, що дозволяють пізніше зв'язування.
Для інтерфейсу класу генерація ідентифікаторів DispId здійснюється на основі позиції члена в інтерфейсі. Зміна порядку членів і експорт класу в бібліотеку типів змінюють і ідентифікатори DispId, створені в інтерфейсі класу.
Щоб уникнути порушень в роботі COM-клієнтів з пізнім зв'язуванням при використанні інтерфейсів класів необхідно застосувати атрибут ClassInterfaceAttribute зі значенням ClassInterfaceType.AutoDispatch. Це значення реалізує інтерфейс диспетчеризації класу, але пропускає опис інтерфейсу в бібліотеці типів. Без опису інтерфейсу клієнти не можуть кешувати ідентифікатори DispId під час компіляції. Хоча цей тип інтерфейсу за замовчуванням використовується для інтерфейсу класу, це значення атрибута можна задати явно.
Щоб отримати ідентифікатор DispId члена інтерфейсу під час виконання, COM-клієнти можуть викликати IDispatch.GetIdsOfNames. Щоб викликати метод для інтерфейсу, слід передати повернутий ідентифікатор DispId як аргумент для IDispatch.Invoke.
Здвоєні інтерфейси дозволяють COM-клієнтам виконувати раннє і пізніше зв'язування з членами інтерфейсів. У режимі розробки та при тестуванні може виявитися корисним зробити інтерфейс класу здвоєним. Цей варіант також допустимо і для керованого класу (і його базових класів), який ніколи не буде змінюватися. У всіх інших випадках слід утриматися від того, щоб робити інтерфейс класу здвоєним.
Автоматично створений здвоєний інтерфейс може виявитися корисним в досить рідкісних випадках, але найчастіше він створює труднощі при роботі з версіями. Наприклад, внесення змін в базовий клас легко може порушити роботу COM-клієнтів, які використовують інтерфейс похідного. Якщо базовий клас надається незалежним постачальником, компоновка інтерфейсу класу стає недоступною розробнику. Крім того, здвоєний інтерфейс на відміну від ситуації з інтерфейсом диспетчеризації (ClassInterface.AutoDual) надає в експортовану бібліотеку типів опис інтерфейсу класу. Це опис стимулює клієнтів з пізнім зв'язуванням кешувати ідентифікатори DispId під час виконання.