Маршалинг данных между управляемым и неуправляемым кодом - Возвращаемые значения

ОГЛАВЛЕНИЕ


Возвращаемые значения

До сих пор мы говорили только об аргументах. А что происходит со значениями функций? Среда CLR автоматически воспринимает возвращаемые значения как обычные аргументы с атрибутом [OutAttribute]. Кроме того, среда CLR может трансформировать сигнатуру функции — за этот процесс отвечает атрибут PreserveSigAttribute. Если атрибут [PreserveSigAttribute], относящийся к сигнатуре P/Invoke, имеет значение «ложь», среда CLR сопоставляет возвращаемые значения HRESULT управляемым исключениям, а параметры [out, retval] — значениям, возвращаемым функцией. Рассмотрим в качестве примера следующую сигнатуру управляемой функции:

public static string extern GetString(int id);

После преобразования она превращается в неуправляемую сигнатуру:

HRESULT GetString([in]int id, [out, retval] char **pszString);

Если атрибут [PreserveSigAttribute] имеет значение «истина» (это значение используется по умолчанию при вызовах P/Invoke), преобразование не выполняется. Следует отметить, что для функций COM атрибут [PreserveSigAttribute] обычно по умолчанию имеет значение «ложь», однако есть несколько способов его изменить. Подробные сведения можно найти в документации MSDN® к программам TlbExp.exe и TlbImp.exe.