相关:
我应该在我的应用程序中包含命令行模式吗?
如何获取父进程标准输出?
控制台应用程序可以检测它是否已从资源管理器运行?
我想构建一个控制台应用程序,通常从命令行运行.
但是,当它从资源管理器中双击(而不是从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) 我已经开发了一个可以完成任务的类库,并使用单元测试对其进行了测试.库和测试构建并正常工作.然后,我在Windows服务项目中添加了解决方案,以便将库包装起来.
我添加了对我的类项目的引用,添加了一个using语句并从类lib中删除了一个对象.它的颜色编码很好,Refactor可以按住Ctrl键并导航到它,但是当我构建项目/解决方案时,它声称我的类型是未知的,并且有一个例外:
名称空间'MPN.Apollo'中不存在类型或命名空间名称'EmailLoaderCore'(您是否缺少程序集引用?)
这对我来说没有意义.我已经尝试删除引用,清理解决方案,重新创建引用,但没有快乐.我做错了还是VS2010很奇怪?
我正在用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)
有任何想法吗?
我正在学习可视化Web开发人员c#,实体框架和webservices.
我希望能够运行实体框架,例如不构建gui,或运行浏览器.所以吊点申请参考可以做到这一点.我可以在Visual Web开发人员解决方案中添加控制台应用程序吗?
谢谢
我试图将一个DLL加载到控制台应用程序,然后卸载它并完全删除该文件.我遇到的问题是,在自己的AppDomain中加载dll的行为会在Parent AppDomain中创建一个引用,因此不允许我销毁dll文件,除非我完全关闭程序.有关使此代码有效的任何想法?
string fileLocation = @"C:\Collector.dll";
AppDomain domain = AppDomain.CreateDomain(fileLocation);
domain.Load(@"Services.Collector");
AppDomain.Unload(domain);
Run Code Online (Sandbox Code Playgroud)
顺便说一下,我也尝试过这段代码而且没有运气
string fileLocation = @"C:\Collector.dll";
byte[] assemblyFileBuffer = File.ReadAllBytes(fileLocation);
AppDomainSetup domainSetup = new AppDomainSetup();
domainSetup.ApplicationBase = Environment.CurrentDirectory;
domainSetup.ShadowCopyFiles = "true";
domainSetup.CachePath = Environment.CurrentDirectory;
AppDomain tempAppDomain = AppDomain.CreateDomain("Services.Collector", AppDomain.CurrentDomain.Evidence, domainSetup);
//Load up the temp assembly and do stuff
Assembly projectAssembly = tempAppDomain.Load(assemblyFileBuffer);
//Then I'm trying to clean up
AppDomain.Unload(tempAppDomain);
tempAppDomain = null;
File.Delete(fileLocation);
Run Code Online (Sandbox Code Playgroud) 这些getch和getchar功能之间的确切区别是什么?
我试过几个找到的解决方案,比如一个 - >
但是,我观察到GetConsoleMode(IntPtr hConsoleHandle,out int模式)中的模式对于不同的控制台应用程序将是不同的.它不是恒定的.
我是否可以在控制台应用程序上禁用鼠标单击(右/左按钮)以实现相同的方案.我发现它可以使用IMessageFilter完成,但仅适用于Window Form Application而不适用于控制台应用程序.
请指导.
我试图从互联网上下载多个文件,等待所有这些文件完成.这是我正在运行的C#控制台应用程序,因此不需要任何进度条事件处理程序.但是,即使尚未下载所有文件,它目前仍继续执行代码.
您将如何等待所有异步下载文件完成.
private void DownloadMultipleFiles(List<DocumentObject> doclist)
{
foreach(var value in doclist){
try
{
using (WebClient webClient = new WebClient())
{
string downloadToDirectory = @Resources.defaultDirectory + value.docName;
webClient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
webClient.DownloadFileCompleted += client_DownloadFileCompleted;
webClient.DownloadFileAsync(new Uri(value.docUrl), @downloadToDirectory);
//Add them to the local
Context.listOfLocalDirectories.Add(downloadToDirectory);
}
}
catch (Exception)
{
Errors.printError("Failed to download File: " + value.docName);
}
}
}
Run Code Online (Sandbox Code Playgroud) 我可以自定义标题栏(即更改颜色)还是完全删除它?
将EF更新到版本6.1.1后,我遇到以下错误:
EntityFramework.dll中发生了未处理的"System.InvalidOperationException"类型异常
附加信息:TvstContext自创建数据库以来,支持上下文的模型已更改.请考虑使用"代码优先迁移"来更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269).
我们可以在这个问题中描述过去解决这个问题: EF CTP5中的modelBuilder.IncludeMetadataInDatabase在哪里?
但是,我似乎无法摆脱错误.