关于C#:在Log4net中将控制台附加程序添加到Windows窗体

Adding console appender to a windows form in log4net

是否可以将控制台添加到基于表单的C#应用??程序中?
目前,当我做类似

的操作时

1
Console.WriteLine("testing");

它出现在VS2010的输出窗口中。
我想知道是否可以将控制台附加到我的Windows窗体应用程序中,以便输出显示在控制台中。

编辑:
看来我的第一个问题有点误导,而且没有确切说明我想要完成的工作。我刚刚使用

将控制台添加到了我的应用程序中

1
2
    [DllImport("kernel32")]
    static extern int AllocConsole();

但是我真正想要的是log4net控制台附加程序的输出显示在
该控制台没有发生。
我的附加程序的xml是

1
2
3
4
5
6
7
8
9
    <mapping>
      <level value="INFO" />
      <foreColor value="White" />
      <backColor value="Red, HighIntensity" />
    </mapping>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%class %date - %message %newline" />
    </layout>
  </appender>

现在我什么时候喜欢

1
 log.info("Some log");

它仍然不会在新添加的控制台窗口中显示。关于我该怎么做的任何建议?


只是将其扔在那里,请确保在加载log4net配置之前先AllocConsole()。在将呼叫移至AllocConsole之前,我尝试执行与您的问题类似的操作,并且遇到了相同的问题。移动它后,log4net会自动写入我分配的控制台。

本质上是...(并且请记住执行此处未包括的所有常规错误检查)...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace SampleApp
{
    class Program
    {
        [DllImport("kernel32.dll", SetLastError=true, CallingConvention=CallingConvention.Winapi)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool AllocConsole();

        [DllImport("kernel32.dll", SetLastError=true, CallingConvention=CallingConvention.Winapi)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool FreeConsole();

        [STAThread]
        private static void Main(string[] args)
        {
            // (1) Make sure we have a console to use.
            Program.AllocConsole();
            try {
                // (2) Tell log4net to configure itself according to our app.config data.
                log4net.Config.XmlConfigurator.Configure();
                // (3) Usual WinForms startup code here.
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new SampleApp.Form1());
            } catch ( Exception ) {
                // WAT!
            }
            // (4) Remember to release the console before we exit.
            Program.FreeConsole();
        }
    }
}

不能100%确定为何分配控制台的时间有所不同,但这确实为我解决了这个问题。


只需将您的项目设置为控制台应用程序,然后从控制台应用程序创建/显示表单即可,而不是相反。