لماذا. NET أخطاء غير واضحة داخليا؟
-
07-07-2019 - |
سؤال
وأنا على تشغيل scenerio التالية:
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);
وتمريرة خاطئة ولكن ليكون من المتوقع منذ تتداخل ايم التوالي.
المشكلة هي Marshal.GetLastWin32Error ()] لا عودة ERROR_IO_PENDING
تقوم بإرجاع ERROR_ALREADY_EXISTS. الذي هو غريب بالنسبة لي لأن الخطأ لم تظهر أنني عندما أنشأ الملف، ولكن عندما أكتبه يظهر. أنا الآن في محاولة لمعرفة كيفية إغلاق المؤشر أنني لا يبدو أن لديها أو الحصول على أتلست حصول على تفسير لماذا يحدث هذا.
وتحرير: حسنا، لقد norrowed المشكلة أسفل وأنا أعرف ما هو الذي يسبب المشكلة
private void ErrorOccurred(string detailedError)
{
lock (mLogLock)
{
try
{
System.IO.File.AppendAllText("Device" + mDeviceHandle + "Log.txt",
DateTime.Now.ToLongTimeString() + ": " + detailedError + Environment.NewLine);
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}
}
وعلى ما يبدو، داخليا الدعوة AppendAllText يخلق خطأ. يجب أن إعادة تعيين الخطأ بعد هذه الدعوة السجل؟ أعتقد أن هذا كان من المفيد أن نعرف أن الإطار هو لا إعادة تعيين المكالمات مستوى منخفض في العمل الداخلي وظائفها. آه، هل تعلم شيئا جديدا كل يوم.
واعتقد ان السؤال الجديد لدي هو، وأود أن إعادة تعيين الخطأ مستوى منخفض بعد هذه الدعوة، أم أن هناك طريقة أخرى لتسجيل الإخراج (عدم استخدام أدوات مثل 3rd الطرف log4Net أو الحصول على يتوهم مع الإخراج Debug.Trace) ؟ Bascially نوعا لفتح ملف لإلحاق أن لا تؤثر على Marshal.GetLastWin32Error ()؛ الانتاج.
المحلول 2
ولقد المحدد باستخدام Marshal.GetLastWin32Error
لتصحيح الأخطاء ليست أفضل طريقة للذهاب.
نصائح أخرى
وMarshal.GetLastWin32Error () ينبغي أن يكون أول شيء تفعله بعد الدعوة Win32API.WriteFile (). لا تفعل أي شيء آخر، على سبيل المثال، أي قطع الأشجار وغيرها، وبين WriteFile () وGetLastWin32Error () يدعو.
استخدم SetLastError = صحيح في الإعلان DllImport.