سؤال

أحاول إعادة توجيه إخراج ملف dll الأصلي لجهة خارجية والذي يتم إخراجه إلى stdout/stderr من داخل C#.يجب أن ينتقل مخرجات كل من stdout وstderr إلى ملف السجل.

ها هي فكرتي (x2 لتدفقين):

  • يخترع AnonymousPipeServerStream
  • احصل على مقبض الأنبوب عبر _outServer.SafePipeHandle.DangerousGetHandle()
  • استخدم P/Invocation للاتصال SetStdHandle بالمقبض المذكور
  • يخترع AnonymousPipeClientStream متصل بتدفق الخادم
  • قم بإنشاء موضوع للجلوس في حلقة القراءة من AnonymousPipeClientStream والإخراج إلى المسجل.
  • اتصل بشكل دوري flush على ال AnonymousPipeServerStream

لذلك يبدو أن كل هذا يعمل بشكل جيد ...ضمن الكود الخاص بي.بمجرد انتقال التحكم إلى DLL الأصلي، يعود كل شيء إلى stderr!إذا لزم الأمر، يمكنني تصحيح الأخطاء في ملف DLL الأصلي ومعرفة ما يحدث من خطأ، ولكن...أنا أفضل ألا أفعل ذلك حقًا، فهل لدى أي شخص أي أفكار قبل أن أقضي 10 ساعات في محاولة معرفة كيفية عمل المقابض؟

كمرجع، رمز الاختبار موجود في: http://pastebin.com/f3eda7c8.الأشياء المثيرة للاهتمام هي الأسطر 58-89 في المنشئ.(سأضيف معالجة الأخطاء، وما إلى ذلك.لاحقا طبعا).

هل كانت مفيدة؟

المحلول

لقد قمت بحلها، على الرغم من أن الحل (بالطبع) لا علاقة له بالمشكلة.تم تجميع ملف dll في mingw، والذي يبدو أنه لا يحترم المقابض المستخدمة في وقت تشغيل MSVC.

سأترك الكود والحل في حالة مواجهة أي شخص آخر لهذه المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top