قمع 3RD حدة الانتاج مكتبة الحزب؟
-
05-07-2019 - |
سؤال
وأحتاج إلى الاتصال مكتبة 3rd الطرف الذي يحدث لبث حفنة من الاشياء إلى وحدة التحكم. رمز ببساطة مثل هذا ...
int MyMethod(int a)
{
int b = ThirdPartyLibrary.Transform(a); // spews unwanted console output
return b;
}
هل هناك طريقة سهلة لقمع حدة الانتاج غير المرغوب فيها من ThirdPartyLibrary؟ لأسباب تتعلق بالأداء والعمليات أو مواضيع جديدة لا يمكن أن تستخدم في الحل.
المحلول
وحسنا يمكنك استخدام Console.SetOut
لتنفيذ TextWriter
الذي لا يكتب في أي مكان:
Console.SetOut(TextWriter.Null);
وهذا سوف قمع <م> على الرغم من كل م> وحدة الانتاج. هل يمكن أن تحافظ دائما على الإشارة إلى <م> الأصلي م> الكاتب Console.Out
واستخدام ذلك لإخراج الخاص بك.
نصائح أخرى
وهنا طريقة واحدة للقيام بذلك (والتي أيضا عادة يغطي التطبيقات المدارة C ++ أنك P / استدعاء من C # أو غير ذلك):
internal class OutputSink : IDisposable
{
[DllImport("kernel32.dll")]
public static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll")]
public static extern int SetStdHandle(int nStdHandle, IntPtr hHandle);
private readonly TextWriter _oldOut;
private readonly TextWriter _oldError;
private readonly IntPtr _oldOutHandle;
private readonly IntPtr _oldErrorHandle;
public OutputSink()
{
_oldOutHandle = GetStdHandle(-11);
_oldErrorHandle = GetStdHandle(-12);
_oldOut = Console.Out;
_oldError = Console.Error;
Console.SetOut(TextWriter.Null);
Console.SetError(TextWriter.Null);
SetStdHandle(-11, IntPtr.Zero);
SetStdHandle(-12, IntPtr.Zero);
}
public void Dispose()
{
SetStdHandle(-11, _oldOutHandle);
SetStdHandle(-12, _oldErrorHandle);
Console.SetOut(_oldOut);
Console.SetError(_oldError);
}
}
وهذه الفئة يمكن أن يسمى كما يلي:
using (new OutputSink())
{
/* Call 3rd party library here... */
}
وهذا سيكون له تأثير. أي منطق التطبيق الذي يحاول استخدام وحدة التحكم عن موضوع آخر خلال الوقت الذي كنت using
وOutputSink
لن تعمل بشكل صحيح الكتابة إلى الإخراج القياسي، الخطأ المعياري، خرج وحدة التحكم، أو خطأ وحدة التحكم.