首页 / C# / 创建一个cmd窗口并从C#应用程序写入它
创建一个cmd窗口并从C#应用程序写入它
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了创建一个cmd窗口并从C#应用程序写入它,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1740字,纯文字阅读大概需要3分钟。
内容图文
![创建一个cmd窗口并从C#应用程序写入它](/upload/InfoBanner/zyjiaocheng/820/3821f40299ef425d8e69e042996c2189.jpg)
我正在为Rhino的Grasshopper开发一个C#组件.当我运行一些非常繁重的迭代分析时,我想将结果连续输出到cmd窗口,以确保分析实际上正在运行.
这是我试过的:
using System.Diagnostics;
Result results = new Result();
Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.CreateNoWindow = false;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();
do {
results = RunHeavyOperation(results);
cmd.StandardInput.WriteLine("echo " + results.usefulInfo);
} while (!results.conditionForEnd);
cmd.WaitForExit();
Result RunHeavyOperation(Result previousResults) {
Result res = doHeavyStuff(previousResults);
return res;
}
我意识到我错过了一部分,但它是什么?
解决方法:
您的方法是错误的:您当前没有写入控制台窗口.相反,您通过启动cmd.exe并写入该进程的标准输入管道来创建进程. cmd.exe不知道这一点.这与通过键盘输入控制台不同,甚至可能产生奇怪的效果.
想象一下,您输出一个新的行字符,因此cmd.exe可能会尝试“执行”您之前输出的内容作为命令.
正确的方法是调用AllocConsole.通过此调用,您可以为流程创建一个控制台窗口,并通过Console.WriteLine()简单地使用它.
当您完成工作并进行日志记录后,您最终需要通过FreeConsole关闭并再次释放此控制台.
所以导入这两个本机方法:
internal sealed class NativeMethods
{
[DllImport("kernel32.dll")]
public static extern bool AllocConsole();
[DllImport("kernel32.dll")]
public static extern bool FreeConsole();
}
并在您的代码中使用它们:
NativeMethods.AllocConsole();
// start work
Console.WriteLine("log messages...");
// finished work
NativeMethods.FreeConsole();
请注意,FreeConsole()将关闭控制台窗口,因此所有日志消息都会丢失.并且控制台只有一个如此大的缓冲区,如果离开缓冲区,则无法滚动回较旧的消息.
因此,将日志消息简单地写入您可以在以后分析的文件中可能是一个更好的主意.
内容总结
以上是互联网集市为您收集整理的创建一个cmd窗口并从C#应用程序写入它全部内容,希望文章能够帮你解决创建一个cmd窗口并从C#应用程序写入它所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。