我搜索了网络和Stackoverflow,我没有找到任何东西。 如果这个问题已经存在,我很抱歉。
如果通过cmd调用我的C#应用程序,例如:
C:\ System32 \ MyConsoleApplication -parmOne -paramTwo ...
有没有办法写入cmd(例如提供进度信息?)
编辑:因为我使用了一个Console应用程序解决方案ist Console.WriteLine
它不适合我,因为我的应用程序需要管理员(通过Manifest文件)并且使用普通用户权限调用。在这种情况下,UAC要求权限并使用该应用程序打开一个新的Cmd。
答案 0 :(得分:8)
更好的解决方案:http://www.nerdyhearn.com/blog/157/
这是网站的代码:
[DllImport("kernel32.dll")]
static extern bool AttachConsole(int dwProcessId);
private const int ATTACH_PARENT_PROCESS = -1;
[STAThread]
static void Main(string[] args)
{
// Enable visual elements just like always
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// Attach to the parent process via AttachConsole SDK call
AttachConsole(ATTACH_PARENT_PROCESS); // <-- important point here
Console.WriteLine("This is from the main program");
Application.Run(new Form1());
}
您可以在需要的特殊条件下随意使用AttachConsole
来电。这样更好,更灵活,不需要您更改应用程序清单。如果它是一个win32应用程序,对你的应用程序有好处。如果它从cmd启动,那么输出将显示为已被删除。
我的观点:这只是一些在Unix世界中如此纯粹和自然的概念的一些无用的微软复杂化。如果您的应用程序是从可视启动器(icon,nautilus ..)启动的,那么输出就会丢失。您可以从控制台启动应用程序,然后将其置于控制台中。你可以根据需要重定向输出,它可以逻辑地重叠并且功能强大。随着微软......它臃肿并阻碍了每个人。
答案 1 :(得分:3)
这一切都取决于exe
类型是什么 - 这是PE-header(“exe”shell)中的标志:
它不可能两者兼而有之。你希望它像正常的Windows exe一样工作,然后你必须编译它作为一个Windows exe,这意味着没有:它不会正常写入控制台。试图从Windows exe获取对控制台的访问权限是棘手的,并且需要P / Invoke到操作系统。
如果 标记为控制台exe,那么Console.WriteLine
只会正常工作。