我希望能够在C#控制台应用程序中捕获CTRL+ C,以便我可以在退出之前执行一些清理.这样做的最佳方式是什么?
在.NET中,是否有一种方法(如事件)用于检测控制台应用程序何时退出?我需要清理一些线程和COM对象.
我正在从控制台应用程序运行一个没有表单的消息循环.我正在使用的DCOM组件似乎要求应用程序泵消息.
我已经尝试向Process.GetCurrentProcess.Exited和Process.GetCurrentProcess.Disposed添加一个处理程序.
我还尝试向Application.ApplicationExit和Application.ThreadExit事件添加处理程序,但它们没有触发.也许那是因为我没有使用表格.
我正在寻找一种方法来在手动关闭控制台应用程序时触发一段代码(用户关闭窗口).一直在尝试:
AppDomain.CurrentDomain.ProcessExit +=
new EventHandler(CurrentDomain_ProcessExit);
Run Code Online (Sandbox Code Playgroud)
但如果手动关闭,上述操作无效.
有没有办法使用.Net调用或我是否需要导入内核DLL并以这种方式执行?
我有一个像C#这样的控制台程序
Class Program
{
static void main(string args[])
{
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想在main()退出后做一些事情.我试图为类程序编写一个解构函数,但它永远不会被击中.
有人知道怎么做.
非常感谢
我想要发生的事情是控制台窗口消失了,或者更好,但它是隐藏的,但我希望我的应用程序继续运行.那可能吗?我希望能够使用Console.WriteLine并将控制台用作输出窗口.我希望能够隐藏和显示它,并且我不希望整个应用程序因为控制台关闭而死亡.
编辑
码:
internal class SomeClass {
[DllImport("kernel32")]
private static extern bool AllocConsole();
private static void Main() {
AllocConsole();
while(true) continue;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑2
我根据这个问题的评论中的建议尝试了这里接受的解决方案[ Capture console exit C# ].示例代码的错误在于DLLImport需要是"kernel32.dll"或"kernel32",而不是"Kernel32".进行更改后,当我单击控制台窗口上的X时,我正在向CTRL_CLOSE_EVENT的处理程序发送消息.但是,调用FreeConsole和/或返回true并不会阻止应用程序终止.
我需要禁用用C#编写的visual studio控制台应用程序的控制台窗口中的关闭按钮.我希望应用程序运行直到它完成,用户不能通过关闭控制台窗口来停止它.我正在使用visual studio 2010
我正在编写一个C#应用程序,需要在控制台关闭时上传文件(通过X按钮,或者计算机关闭).
我怎么能这样做?
AppDomain.CurrentDomain.ProcessExit += new EventHandler (OnExit);
Run Code Online (Sandbox Code Playgroud)
仅在我exit向控制台发出命令时运行,而不是在我按下红色关闭按钮时运行.
请仅在解决方案通过X按钮关闭控制台时运行解决方案,并且当计算机关闭时(通常通过Windows,我知道如果电源被拉到xD则不能).
有没有办法监视使用该DLL的应用程序何时关闭?DLL和应用程序都是C#,Windows Forms也不是.
我可以检查主应用程序什么时候关闭,但我想让DLL看到"嘿程序正在关闭并释放我,我应该在我死之前快速做到这一点".
有办法吗?或者我不知道应用菜单"在你死之前做这个"?
使用代码从这个线程挂钩控制台关闭事件,我有时得到一个NullReferenceException没有堆栈跟踪(大多数时候我没有).它发生在发布和调试中,并且"抛出异常时中断"没有帮助(它中断,但堆栈跟踪仍为空).当我正常退出我的应用程序时(我正在点击进入并因此释放a Console.ReadLine),我从未得到此异常.应用程序事件日志有2个条目:
应用程序:MyApp.exe Framework版本:v4.0.30319描述:由于未处理的异常,进程已终止.异常信息:System.NullReferenceException Stack:
和:
故障应用程序名称:Gateway.exe,版本:1.0.0.0,时间戳:0x4e284101故障模块名称:未知,版本:0.0.0.0,时间戳:0x00000000异常代码:0xc0000005故障偏移:0x004d41ce故障进程id:0xf00故障应用程序启动时间:0x01cc47b827e19a6e错误应用程序路径:C:\ dev\MyApp.exe错误模块路径:未知报告ID:689c1caa-b3ab-11e0-ba1b-00247e777f12
当应用程序退出时,需要通知我们的代码库.所以我们订阅了System.Window.Forms.Application.ApplicationExit事件.这适用于Winforms应用程序,但它是否也适用于其他类型的应用程序,如控制台应用程序,服务和Web应用程序(如ASP.NET)?命名空间会表明它没有,并且可能在Application.Exit()被调用时(明确地或隐含地)被提升,这可能不适合调用这些其他情况.
还有一些其他事件在这些其他情况下会更好,或者更普遍吗(如果它适用于Winforms也很好)?例如,是否有一个关于何时Environment.Exit()被调用的事件(控制台应用程序)?
我在System.Diagnostic.Process中发现了一个Exited事件,但这似乎是为了监视另一个进程的退出,并且它似乎没有被进程接收到它自己(例如,Process.GetCurrentProcess().Exited += Process_Exited; Process.GetCurrentProcess().EnableRaisingEvents = true;).我认为它可能只是在该过程实际退出后才会提出,所以这不起作用.
这尤其适用于.NET 2.0和C#.