【问题标题】:Winform application to write its messages in consoleWinform 应用程序在控制台中写入其消息
【发布时间】:2013-06-27 10:40:24
【问题描述】:

我在这里有 2 个提案。我正在运行一个 Windows 应用程序。 第一个建议是我应该将消息直接写入控制台(命令提示符),即使它不是控制台应用程序。

第二个选项是我应该创建一个控制台应用程序,它应该在其中读取 Windows 应用程序生成的日志文件并将其写入控制台。请注意,Windows 应用程序将在运行时实时更新日志文件,我希望控制台应用程序在下一刻自行读取日志中的每条更新消息。这可能吗??

哪个可行?以及如何实现?

非常感谢快速响应.. 谢谢...

【问题讨论】:

  • System.Console.WriteLine...
  • 写入事件日志怎么样?
  • @MartinMilan:这在 winforms 应用程序中不起作用..
  • 我正在远程运行 winform 应用程序。我应该能够在我当前系统的 Web 界面中读取结果,我使用了另一种技术。这就是为什么我要基于控制台的结果。
  • 您可以调用 Windows API AttachConsole 函数将您的 WinForms 应用程序附加到控制台。但是,您不能让控制台在一台计算机上运行而 WinForms 应用程序在另一台计算机上运行。

标签: winforms c#-4.0 console-application


【解决方案1】:

第三种方法 - 使用进程间通信来监听来自控制台应用程序的 winforms 应用程序事件。例如,您可以使用 .NET Remoting、WCF 或 MSMQ。

因此,您需要从 Windows 窗体应用程序写入日志,并在控制台应用程序中接收相同的数据,然后您可以利用 NLog 日志框架,它可以写入日志both to files and MSMQ。从 Nuget.0 获取 NLog.dllNLog.Extended.dllNLog.config 文件中配置两个目标:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

 <targets>
    <target xsi:type="MSMQ" name="msmq" queue=".\private$\CoolQueue"
         useXmlEncoding="true" recoverable="true" createQueueIfNotExists="true"
         layout="${longdate}|${level:uppercase=true}|${logger}|${message}"/>
    <target xsi:type="File" name="file" fileName="logs/${shortdate}.log"
         layout="${longdate} ${uppercase:${level}} ${message}" />
  </targets>
  <rules>
    <logger name="*" minlevel="Trace" writeTo="msmq" />
    <logger name="*" minlevel="Trace" writeTo="file" />
  </rules>
</nlog>

然后在你的winforms应用程序中获取记录器

private static Logger _logger = LogManager.GetCurrentClassLogger();

并用它来写日志消息:

private void button1_Click(object sender, EventArgs e)
{
    _logger.Debug("Click");
}

现在转到控制台应用程序。您需要从 MSMQ 队列中读取消息,这些消息由 winforms 应用程序发布。创建队列并开始监听:

string path = @".\private$\CoolQueue";

MessageQueue queue = MessageQueue.Exists(path) ?
    new MessageQueue(path) :
    MessageQueue.Create(path);

queue.Formatter = new XmlMessageFormatter(new[] { typeof(string) });
queue.ReceiveCompleted += ReceiveCompleted;
queue.BeginReceive();

收到消息后将消息写入控制台:

static void ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
{        
    Console.WriteLine(e.Message.message.Body);
    var queue = (MessageQueue)sender;
    queue.BeginReceive();
}

如果您想使用 Remoting,请查看 Building a Basic .NET Remoting Application 文章。

【讨论】:

  • 谢谢你..但是你能描述一下我该怎么做吗??
  • @VysakhVenugopal 没问题,我会添加一些示例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 2022-11-14
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多