Настройка вызываемых оболочек COM
Обновлен: Ноябрь 2007
Настройка вызываемых оболочек COM является простой задачей. Если тип, который нужно предоставить COM-клиенту, предъявляет нестандартные требования к маршалингу, для изменения поведения маршалинга примените атрибут System.Runtime.InteropServices.MarshalAsAttribute к параметру метода, полю класса или возвращаемому значению.
Как показано на следующем рисунке, экспортировать управляемые DLL можно без настройки оболочки (показанной слева). Или же можно добавить сведения о маршалинге в источник, выполнить его компиляцию и использовать программу экспорта библиотеки типов (Tlbexp.exe) для экспорта измененной DLL и получения пользовательской оболочки.
Сведения о маршалинге в экспортированных библиотеках DLL
Примечание. |
---|
Все управляемые типы, методы, свойства, поля и события, доступ к которым нужно предоставить 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