4

我搜索了网络和 Stackoverflow,我没有找到任何东西。如果这个问题已经存在,我很抱歉。

如果通过 cmd 调用我的 C# 应用程序,例如:

C:\System32\MyConsoleApplication -parmOne -paramTwo ...

有没有办法写入cmd(例如提供进度信息?)

编辑:因为我使用控制台应用程序解决方案Console.WriteLine它对我不起作用,因为我的应用程序需要管理员权限(通过 Manifestfile)并以普通用户权限调用。在这种情况下,UAC 请求权限并使用应用程序打开一个新的 Cmd。

4

2 回答 2

11

更好的解决方案: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 世界中如此纯粹和自然的概念的一些无用的微软复杂化。如果您的应用程序是从可视启动器(图标、nautilus..)启动的,则输出将丢失。您可以从控制台启动您的应用程序,并将其获取到控制台中。如果需要,您可以重定向输出,这一切都合乎逻辑且功能强大。与微软...它臃肿并且妨碍每个人。

于 2014-02-24T09:13:15.843 回答
3

这一切都取决于exe类型是什么——它是 PE 头(“exe”外壳)中的一个标志:

  • 如果它被标记为 Windows 应用程序,它不会获得控制台/输出到现有控制台 - 无论它是如何启动的
  • 如果它被标记为控制台应用程序,它确实会获得一个控制台/输出到现有控制台 - 无论它是如何启动的

不能两者兼而有之。如果您希望它像 windows exe 一样正常工作,那么您必须将其编译为 windows exe,这意味着不:它不会正常写入控制台。尝试从 Windows exe 获取对控制台的访问权限是很棘手的,并且需要对操作系统进行 P/Invoke。

如果它标记为控制台 exe,那么就Console.WriteLine可以正常工作。

于 2013-08-23T07:10:03.467 回答