可能重复:
.Net控制台应用程序无法启动控制台
我有一个用VB.NET编写的控制台应用程序,它将成为Web服务器上的计划任务.它将每十分钟运行一次.问题是每隔十分钟它会在处理时显示空的黑色CMD窗口,这可能会分散注意力.如何配置它在后台运行(没有显示CMD窗口)?
伙计们。我尝试使用 DI (.NET Core 3.1) 将日志记录添加到我的控制台应用程序,并且 IoC 容器似乎可以正常工作,将记录器依赖项注入到我的类中,但 LogXXX 方法不会记录到输出。可能是什么原因?也许还有一些额外的配置?
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace DependencyInjection
{
class Program
{
static void Main(string[] args)
{
var services = new ServiceCollection();
ConfigureServices(services);
var serviceProvider = services.BuildServiceProvider();
var logger = serviceProvider.GetService<ILogger<Program>>();
logger.LogInformation("Hello world!");
}
static void ConfigureServices(ServiceCollection services)
{
services.AddLogging(loggerBuilder =>
{
loggerBuilder.ClearProviders();
loggerBuilder.AddConsole();
});
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Visual Studio.我有一个包含2个控制台应用项目的解决方案.当我按下运行时,它们与Visual Studio出现在同一屏幕上.但我需要在另一个没有Visual Studio的屏幕上看到控制台输出.
是否可以向Atom添加实时(交互式)控制台窗口?请注意,这与向LightTable添加实时控制台会话的文章类似,不同之处在于它适用于Atom.
基本上,我对Geany能够做的集成终端仿真感兴趣:

有没有办法在Github的Atom文本编辑器中执行此操作?
对于在英语Windows(XP,Vista或7)上使用Visual Studio 2008编译的C++控制台应用程序.是否可以打印到控制台并使用cout或wcout正确显示UTF-8编码的日语?
相关:
我应该在我的应用程序中包含命令行模式吗?
如何获取父进程标准输出?
控制台应用程序可以检测它是否已从资源管理器运行?
我想构建一个控制台应用程序,通常从命令行运行.
但是,当它从资源管理器中双击(而不是从cmd.exe提示符运行)时,我希望该程序不显示控制台窗口.
我想避免这个:
替代文字http://i36.tinypic.com/1088p5s.jpg
可能吗?
编辑我想另一种问题是,程序是否有可能知道它是如何被调用的 - 无论是通过双击还是通过命令行?
我在Windows上使用.NET.
编辑2:从这篇Old New Thing博客文章中我学到了一些好东西.这就是我现在所知道的......
在Windows中,EXE文件标记为GUI或非GUI.使用csc.exe,可以使用/target:winexe或选择它/target:exe.在执行流程中的第一条指令之前,Windows内核会设置执行环境.此时,如果EXE标记为GUI,则内核将进程的stdin/stdout设置为NULL,如果非GUI(命令行),则内核创建控制台并将进程的stdin/stdout设置为安慰.
启动进程时,如果没有stdin/stdout(== /target:winexe),则立即返回调用.因此,从cmd.exe启动gui应用程序,您将立即返回cmd提示符.如果存在stdin/stdout,并且从cmd.exe运行,则父cmd.exe将等待进程退出.
"立即返回"很重要,因为如果您编写GUI应用程序以附加到其父控制台,您将能够执行console.writeline等.但cmd.exe提示是活动的.用户可以键入新命令,启动新进程等.换句话说,从winexe,只需附加到父控制台,AttachConsole(-1)不会"变成"控制台应用程序.
此时我认为允许应用程序使用控制台的唯一方法是从cmd.exe调用它,而不是在双击时使用它,就是将exe定义为常规控制台exe(/target:exe),并且如果合适,在启动时隐藏窗口.您仍然会暂时显示控制台窗口.
我仍然没有想过如何知道它是从explorer或cmd.exe启动的,但我越来越近了..
解答
无法构建不显示控制台窗口的控制台应用程序.
这是可能的构建非常迅速隐藏其窗口控制台应用程序,但不能如此之快,这是因为如果从来没有出现的窗口.
现在,为了确定是否从资源管理器启动了一个控制台应用程序,有些人建议查看它正在运行的控制台
(来自mgb的答案和知识库文章99115):
int left = Console.CursorLeft;
int top = Console.CursorTop;
bool ProcessWasRunFromExplorer = (left==0 && top==0);
Run Code Online (Sandbox Code Playgroud)
这告诉您该进程是否在其自己的控制台中启动,而不是它是否是资源管理器.在资源管理器中双击可以执行此操作,但是应用程序内的Start.Process()也会执行相同的操作.
如果要以不同方式处理这些情况,请使用此方法来了解父进程的名称:
System.Console.WriteLine("Process id: {0}", Process.GetCurrentProcess().Id);
string name = Process.GetCurrentProcess().ProcessName ;
System.Console.WriteLine("Process name: {0}", …Run Code Online (Sandbox Code Playgroud) 我正在用C++编写一个控制台应用程序.
我使用SetConsoleCtrlHandler来捕获close和CTRL + C按钮.这允许我的所有线程停止并正确退出.
其中一个线程执行一些保存,需要一些时间来完成,我有一些代码在控制台crtl句柄例程中等待.MSDN指定CTRL_CLOSE_EVENT在5秒后弹出一个框,但我的进程退出.
这对于调试控制台应用程序也很烦人,因为在您可以单步执行之前进程退出并且我不知道可能是什么问题(我有Windows 7 64位).
另外,奇怪的是如果我的例程返回TRUE(只是禁用关闭操作),它仍然会关闭应用程序.该例程会被调用,因此SetConsoleCtrlHandler已成功安装.
例如:
BOOL WINAPI ConsoleHandlerRoutine(DWORD dwCtrlType)
{
if (dwCtrlType == CTRL_CLOSE_EVENT)
{
return TRUE;
}
return FALSE;
}
int _tmain(int argc, _TCHAR* argv[])
{
BOOL ret = SetConsoleCtrlHandler(ConsoleHandlerRoutine, TRUE);
while (true)
{
Sleep(1000);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我编写了一个控制台应用程序,它本质上是一个Console.ReadLine() - Loop.当应用程序等待输入时,按向上箭头键会迭代所有先前的输入行.我的应用程序不包含此功能的任何代码.Windows的哪个部分提供此功能?我该如何禁用它?
我只能想象它是控制台子系统的一个功能,或者是在Console.ReadLine()中实现的.
以下是一些展示所描述行为的示例代码:
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string input;
do
{
input = System.Console.ReadLine();
} while (input != "exit");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想暂时禁用历史记录功能,稍后使用我自己的代码重新实现它.目前的行为太有限了.
我正在学习可视化Web开发人员c#,实体框架和webservices.
我希望能够运行实体框架,例如不构建gui,或运行浏览器.所以吊点申请参考可以做到这一点.我可以在Visual Web开发人员解决方案中添加控制台应用程序吗?
谢谢
我有一个名为MyTool.exe的控制台应用程序
什么是收集传递给这个控制台应用程序了命名参数的最简单方法,然后把它们放在一个Dictionarty<string, string>()里面会有参数名称作为键和值作为参数?
例如:
MyTool foo=123432 bar=Alora barFoo=45.9
Run Code Online (Sandbox Code Playgroud)
我应该能够获得一本字典:
MyArguments["foo"]=123432
MyArguments["bar"]="Alora"
MyArguments["barFoo"]="45.9"
Run Code Online (Sandbox Code Playgroud)