Поделиться через


Настройка вызываемых оболочек COM

Обновлен: Ноябрь 2007

Настройка вызываемых оболочек COM является простой задачей. Если тип, который нужно предоставить COM-клиенту, предъявляет нестандартные требования к маршалингу, для изменения поведения маршалинга примените атрибут System.Runtime.InteropServices.MarshalAsAttribute к параметру метода, полю класса или возвращаемому значению.

Как показано на следующем рисунке, экспортировать управляемые DLL можно без настройки оболочки (показанной слева). Или же можно добавить сведения о маршалинге в источник, выполнить его компиляцию и использовать программу экспорта библиотеки типов (Tlbexp.exe) для экспорта измененной DLL и получения пользовательской оболочки.

Сведения о маршалинге в экспортированных библиотеках DLL
Программа экспорта библиотек типов

3bwc828w.alert_note(ru-ru,VS.90).gifПримечание.

Все управляемые типы, методы, свойства, поля и события, доступ к которым нужно предоставить COM-объектам, должны быть открытыми. Типы должны использовать открытый конструктор по умолчанию, представляющий собой единственный конструктор, который можно вызывать с помощью COM. Дополнительные сведения см. в разделе Уточнение типов .NET для взаимодействия.

При маршалинге данных между управляемым и неуправляемым кодами маршалер взаимодействий должен распознавать представления передаваемых данных:

  • Для непреобразуемых типов управляемые и неуправляемые представления всегда одинаковы. Например, 4-байтовое целое всегда маршалируется в 4-байтовое целое. Для определения представления данных упаковщик взаимодействия использует управляемую подпись.

  • Для преобразуемых типов упаковщик взаимодействия распознает управляемое представление по соответствующей подписи метода, но он не может выполнить то же самое для неуправляемого представления. Для маршалинга преобразуемых типов можно использовать один из следующих методов:

    • Разрешить упаковщику определить представление из управляемого представления.

    • Предоставить явно представление неуправляемых данных.

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

Применение MarshalAsAttribute к параметру

Public Sub M1
(<MarshalAs(UnmanagedType.LPWStr)> msg As String)
public void M1
([MarshalAs(UnmanagedType.LPWStr)]String msg);

Применение MarshalAsAttribute к полю в классе

Class MsgText
<MarshalAs(UnmanagedType.LPWStr)> Public msg As String
End Class
class MsgText {
[MarshalAs(UnmanagedType.LPWStr)] Public String msg;
}

Применение MarshalAsAttribute к возвращаемому значению

Public Function M2() _
As <MarshalAs(UnmanagedType.LPWStr)> String
[return: MarshalAs(UnmanagedType.LPWStr)]
public String GetMessage();

Чтобы указать нужный формат неуправляемого типа, разработчик может задать перечисление System.Runtime.InteropServices.UnmanagedType. В предыдущих подписях данные msg были маршалированы как буфер символов в кодировке Юникод (LPWStr), завершающийся значением null.

Иногда упаковщику взаимодействия требуется больше сведений, чем предоставляет формат управляемых и неуправляемых данных. Например, для маршалинга массива необходимо предоставить тип элемента, ранг, размер и границы массива. Для задания необходимых дополнительных сведений можно использовать атрибут MarshalAsAttribute.

См. также

Основные понятия

Типы данных COM

Настройка вызываемых оболочек времени выполнения

Ссылки

Настройка вызываемых оболочек COM

Другие ресурсы

Маршалинг данных с помощью COM-взаимодействия

Характеристики маршалинга по умолчанию