2009-09-15 32 views
0

Je courais le scenerio suivant:Pourquoi .NET ne supprime pas les erreurs en interne?

SafeFileHandle handle = Win32API.CreateFile((deviceName + "\\" + pipeName), 
          DesiredAccess.GENERIC_WRITE | DesiredAccess.GENERIC_READ, 
          ShareMode.FILE_SHARE_WRITE | ShareMode.FILE_SHARE_READ, 
          IntPtr.Zero, 
          CreationDisposition.OPEN_EXISTING, 
          FlagsAndAttributes.FILE_ATTRIBUTE_NORMAL | FlagsAndAttributes.FILE_FLAG_OVERLAPPED, 
          IntPtr.Zero); // Marshal.GetLastWin32Error() returns 0 (success) 

bool pass = Win32API.WriteFile(writeHandle, message.ToArray(), (uint)message.Count, ref bytes_written, ref over_lapped); 

passe est faux mais prévisible, car im fonctionnement chevauché.
Le problème est Marshal.GetLastWin32Error() ne retourne pas ERROR_IO_PENDING il renvoie ERROR_ALREADY_EXISTS. Ce qui est bizarre pour moi parce que l'erreur ne montre pas que lorsque j'ai créé le fichier, mais quand j'écris il apparaît. Maintenant, j'essaie de comprendre comment fermer la poignée à laquelle je ne semble pas avoir accès ou au moins obtenir une explication de la raison pour laquelle cela se produit.

EDIT: Ok, je n'ai pas résolu le problème et je sais ce qui cause le problème. Apparemment, en interne, l'appel AppendAllText crée une erreur. Devrais-je réinitialiser l'erreur après cet appel de journal? Je suppose que cela aurait été utile de savoir que le cadre ne réinitialise pas les appels de bas niveau dans le fonctionnement interne de ses fonctions. Ahh, tu apprends quelque chose de nouveau tous les jours. Je devine la nouvelle question que je dois avoir, dois-je réinitialiser l'erreur de bas niveau après cet appel, ou existe-t-il un autre moyen de journaliser la sortie (n'utilisant pas d'outils tiers comme log4Net ou devenant fantaisiste avec la sortie Debug.Trace)? Basiquement d'une façon ou d'une autre pour ouvrir un fichier pour l'ajout qui n'affecte pas le Marshal.GetLastWin32Error(); sortie.

+0

Je ne comprends pas vraiment votre problème: le code est-il exécuté simultanément par plusieurs threads? Le fichier est-il ouvert par une application différente? Ou le fichier n'existe-t-il PAS? –

+0

Le code est exécuté sur un thread par lui-même. Le handle de fichier est ouvert sur le thread principal et transmis dans le thread en cours (et est vérifié pour s'assurer qu'il est valide avant d'appeler WriteFile.) L'appel CreateFile fonctionne bien (retourne un handle et n'est pas InValid). erreur ERROR_ALREADY_EXISTS – SwDevMan81

Répondre

0

J'ai déterminé en utilisant Marshal.GetLastWin32Error pour le débogage n'est pas la meilleure voie à suivre.

0

Marshal.GetLastWin32Error() devrait être la toute première chose que vous faites après l'appel de Win32API.WriteFile(). Ne faites rien d'autre, par ex. n'importe quelle journalisation, entre les appels WriteFile() et GetLastWin32Error().

0

Utilisez SetLastError = True dans la déclaration DllImport.

+0

J'ai les opérations suivantes sur toutes les opérations externes: [DllImport ("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] – SwDevMan81