Sulla MSDN ho trovato la seguente descrizione per i due attributi:DllImport - PreserverSig e SetLastError attributi
PreserveSig Impostare il campo PreserveSig su true per tradurre direttamente le firme non gestiti con HRESULT o valori RETVAL; impostarlo su false per convertire automaticamente i valori HRESULT o retval in eccezioni. Per impostazione predefinita, il campo PreserveSig è true.
SetLastError Consente al chiamante di utilizzare la funzione API Marshal.GetLastWin32Error per determinare se si è verificato un errore durante l'esecuzione del metodo. In Visual Basic, il valore predefinito è true (che aggiunge un sovraccarico); in C# e C++, il valore predefinito è falso.
La mia domanda è: come questi due si correlano tra loro? Supponiamo che PreserveSig sia impostato su 'false' - significa che dovrei convertire HRESULT in eccezione - se la funzione non gestita restituisce un intero che indica che si è verificato un errore o nessun errore, come potrebbe essere tradotto in eccezione?
Inoltre, perché è necessario chiamare il metodo GetLastWin32Error se in qualche modo sono riuscito a estrarre l'eccezione utilizzando PreserveSig?
Cordiali saluti PK
Non ho esperienza con gli oggetti COM, quindi mi permetta di porre un'altra domanda riguardante la creazione della firma del metodo. La domanda è: quando vedo che la funzione COM restituisce HRESULT, posso contrassegnare il mio metodo come return void e impostare PreserveSig = false (come hai detto), o impostare PreserveSig = true e contrassegnare il mio metodo come restituire IntPtr per esaminare manualmente il codice restituito? – pkolodziej
Sì, è corretto, tranne che HRESULT sono UInt32s, non IntPtrs. –
Grazie - sei stato molto utile. – pkolodziej