На MSDN я нашел следующее описание для двух атрибутов:DllImport - PreserverSig и SetLastError атрибуты
PreserveSig Установите поле PreserveSig к верному непосредственно перевести неуправляемые подписи с HRESULT или RetVal значений; установите для него значение false, чтобы автоматически преобразовывать значения HRESULT или retval в исключения. По умолчанию поле PreserveSig имеет значение true.
SetLastError Позволяет вызывающему абоненту использовать функцию API Marshal.GetLastWin32Error для определения того, произошла ли ошибка при выполнении метода. В Visual Basic значение по умолчанию истинно (что добавляет некоторые издержки); в C# и C++ значение по умолчанию - false.
Мой вопрос: как эти два относятся друг к другу? Предположим, что у меня установлен PreserveSig на «false» - это означает, что я должен был преобразовать HRESULT в исключение - если неуправляемая функция возвращает целое число, указывающее на ошибку или отсутствие ошибки, как это можно перевести на исключение?
Также почему мне нужно вызвать метод GetLastWin32Error, если мне как-то удалось извлечь исключение, используя PreserveSig?
Сердечные приветы PK
У меня нет опыта работы с объектами COM, поэтому позвольте мне задать еще один вопрос о создании сигнатуры метода. Вопрос: когда я вижу, что функция COM возвращает HRESULT, я могу пометить мой метод как возвращающий void и установить PreserveSig = false (как вы сказали) или установить PreserveSig = true и пометить мой метод как возвращающий IntPtr для ручного изучения возвращаемого кода? – pkolodziej
Да, это правильно, за исключением того, что HRESULT - это UInt32s, а не IntPtrs. –
Спасибо, вы были очень полезны. – pkolodziej