Por MSDN que he encontrado la siguiente descripción de los dos atributos:DllImport - PreserverSig y SetLastError atributos
PreserveSig Configure el campo PreserveSig true para traducir directamente firmas no administrados con HRESULT o valores RETVAL; establézcalo en falso para convertir automáticamente los valores HRESULT o retval a excepciones. Por defecto, el campo PreserveSig es verdadero.
SetLastError Permite que el llamante use la función Marshal.GetLastWin32Error API para determinar si se produjo un error al ejecutar el método. En Visual Basic, el valor predeterminado es verdadero (lo que agrega cierta sobrecarga); en C# y C++, el valor predeterminado es falso.
Mi pregunta es: ¿cómo se relacionan estas dos entre sí? Supongamos que tengo PreserveSig establecido en 'falso' - significa que debería haber convertido HRESULT a excepción - si la función no administrada devuelve un entero que indica que se produjo un error o no se produjo ningún error, ¿cómo podría traducirse esto a excepción?
¿Por qué también necesito llamar al método GetLastWin32Error si de alguna manera logré extraer la excepción con PreserveSig?
Saludos cordiales PK
No tengo experiencia con objetos COM, así que permítanme hacer una pregunta más sobre la creación de la firma del método. La pregunta es: cuando veo que la función COM devuelve HRESULT, puedo marcar mi método como return void y establecer PreserveSig = false (como dijo), o establecer PreserveSig = true y marcar mi método como regresar IntPtr para examinar manualmente el código devuelto? – pkolodziej
Sí, eso es correcto, excepto que HRESULT es UInt32s, no IntPtrs. –
Gracias, ha sido muy útil. – pkolodziej