Sur le MSDN que j'ai trouvé la description suivante pour les deux attributs:DllImport - attributs PreserverSig et SetLastError
PreserveSig Définissez le champ PreserveSig true pour traduire directement les signatures non gérés avec HRESULT ou valeurs RETVAL; Définissez-le sur false pour convertir automatiquement les valeurs HRESULT ou retval en exceptions. Par défaut, le champ PreserveSig est vrai.
SetLastError Permet à l'appelant d'utiliser la fonction Marshal.GetLastWin32Error API pour déterminer si une erreur s'est produite lors de l'exécution de la méthode. En Visual Basic, la valeur par défaut est true (ce qui ajoute une surcharge); en C# et C++, la valeur par défaut est false.
Ma question est: Comment ces deux se rapportent les uns aux autres? Supposons que PreserveSig soit défini sur 'false' - cela signifie que HRESULT devrait être converti en exception - si la fonction non managée renvoie un entier indiquant qu'une erreur ou aucune erreur s'est produite, comment cela pourrait-il être traduit en exception?
Aussi pourquoi ai-je besoin d'appeler la méthode GetLastWin32Error si j'ai réussi à extraire l'exception à l'aide de PreserveSig?
Amitiés PK
Je n'ai pas d'expérience avec les objets COM alors laissez-moi poser une autre question concernant la création de la signature de la méthode. La question est: quand je vois que la fonction COM renvoie HRESULT, je peux marquer ma méthode comme renvoyant void et définir PreserveSig = false (comme vous l'avez dit), ou définir PreserveSig = true et marquer ma méthode comme renvoyant IntPtr pour examiner manuellement le code retourné? – pkolodziej
Oui, c'est correct, sauf que HRESULTs sont UInt32s, pas IntPtrs. –
Merci - vous avez été très utile. – pkolodziej