我正在使用System.Diagnostics.Process我的应用程序中的类创建新进程.
当/如果我的应用程序崩溃了,我希望这个进程被杀死.但是如果我从任务管理器中删除我的应用程序,子进程就不会被杀死.
有没有办法让子进程依赖于父进程?
有没有办法在Windows应用程序中显示控制台?
我想做这样的事情:
static class Program
{
[STAThread]
static void Main(string[] args) {
bool consoleMode = Boolean.Parse(args[0]);
if (consoleMode) {
Console.WriteLine("consolemode started");
// ...
} else {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
Run Code Online (Sandbox Code Playgroud) 我的winform应用程序由另一个应用程序(父代)启动,我需要确定应用程序的pid,它使用c#启动我的应用程序.
我不确定这是否可能,但我希望找到一条线索,以确定当前正在执行的代码是否在IIS Express下运行.到目前为止,我的最佳近似值,令人难以置信的hackish,肯定会在某些时候失败/突破:
bool IsExpress =
Request.ServerVariables["SERVER_SOFTWARE"] == "Microsoft-IIS/7.5"
&& Int32.Parse(Request.ServerVariables["INSTANCE_ID"]) > 1000000000;
Run Code Online (Sandbox Code Playgroud)
当然必须有更好的方法.我对Application,Server和Request对象的检查似乎没有揭示可能提供更好洞察力的任何内容.也许我只需要看一些其他对象?
更新:
如果有一种方法可以检测到这一点,我真的很好奇 - 在这一点上它确实是学术性的,我没有迫切需要使用它.最初的问题就是.但本着回应评论的精神,特别是我有兴趣回答本网站上另一个问题/答案的批评:如何搜索服务器的MIME地图.批评是,发布的答案不适用于IIS Express,只适用于传统的IIS实例.IIS Express将MIME配置存储在applicationhost.config XML文件中,我想更新该答案,以便为IIS Express提供返回该信息的方法.我当然可以添加一些从XML中获取适当值的代码(Yay for LINQ to XML!)但我真的想让它变得更聪明.为了清楚起见,我不需要帮助解析该文件 - 只是尝试检测代码当前是否在IIS Express引擎中执行时更优雅.
更新2:
IIS 8.0 Express Beta 本周发布,它进一步表明我的问题中的方法很脆弱并且会破坏.虽然它不是针对特定版本的交易破坏者,但考虑到这一点并尝试确保代码至少与今天的已知版本一起使用将会很好.
我无法使用Process.Kill().我想我一定是在误解它是如何运作的.这是我的测试功能.我开始一个长时间运行的进程(ping -t),然后在五秒后终止它.
我可以看到ping进程显示,但程序结束后进程仍然存在.我必须手动杀死它.
Console.WriteLine("Total number of ping processes is {0}", Process.GetProcessesByName("ping").Length);
ProcessStartInfo startInfo = new ProcessStartInfo("cmd.exe");
Process process = new Process();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
startInfo.Arguments = "/c ping -t 8.8.8.8";
Console.WriteLine("Staring ping process");
process.StartInfo = startInfo;
process.Start();
Thread.Sleep(5000);
Console.WriteLine("Total number of ping processes is {0}", Process.GetProcessesByName("ping").Length);
Thread.Sleep(5000);
Console.WriteLine("Killing ping process");
process.Kill();
Thread.Sleep(5000);
Console.WriteLine("Total number of ping processes is {0}", Process.GetProcessesByName("ping").Length);
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?
在Visual Studio中运行控制台应用程序时,根据您的设置,它将在程序退出后添加提示:
按任意键继续 ...
我已经找到了如何检测我是否在调试器(使用Debugger.IsAttached)下运行,但它没有帮助.按CTRL-F5以不开始调试设置该标志false,但仍显示提示.
我想检测这个,因为我想显示我自己的消息并等待按键,但不要加倍按键检查.
我不想破坏我的一般Visual Studio设置.如果我可以以可以检查到源代码管理的方式为此项目禁用它,那也可以.
使用什么机制来附加此提示,以及如何检测它?
或者如何为每个项目禁用它,并将此更改检查为源代码管理?
ide console-application visual-studio visual-studio-debugging
我写了这个实用程序(exe),可以在这个宿主应用程序中调用它.我更喜欢它只能从主机应用程序调用该实用程序.从外部或其他主机运行它应立即终止该实用程序.
有没有办法找出哪个进程启动了我的实用程序?
谢谢你的回复.
出于某种原因,没有人svn:ignore在我们的存储库中设置了不错的属性,当我询问它时,响应是"之前没有人抱怨过这种情况,你不能只是放弃'未版本控制的项目'吗?" (我们几乎全球使用TortoiseSVN).
我是团队的新手,所以我想设置一些本地忽略列表,而不是无情地更改存储库.
我知道全局忽略列表,但全局忽略列表不接受特定路径,只接受简单的单级文件模式.我读了一个关于本地忽略列表的问题,但这个问题实际上并不是要求"忽略"未版本控制的文件,而是实际上要求阻止对特定版本化文件的提交.我读了另一个关于忽略本地目录的问题,就像我想做的那样,但是该问题上接受的答案使用了全局忽略列表,由于无法在我的工作副本中指定特定路径,因此对我无效.
我可以svn:ignore在本地设置一些属性,但无法将目录添加到更改列表(如上面的问题中建议的,以避免提交版本化文件),因此我不小心提交了这些更改.
有没有办法在本地忽略我的工作副本树中的特定无版本目录或文件,而不使用svn:ignore?
更新:当前的最佳答案让我非常接近我想要的.它允许我在"检查修改"或"提交"对话框中过滤掉任意文件.但是,如果我想包含目录更改(即更改目录的版本化属性),那么TortoiseSVN也会自动包含目录下的所有文件(即我不能在列表中包含目录,并过滤掉目录下的文件) ).
我正在使用Office互操作创建一个新的Word实例:
var word = Microsoft.Office.Interop.Word.Application();
word.Visible = true;
word.Activate;
Run Code Online (Sandbox Code Playgroud)
我可以像这样得到一个窗口句柄:
var wordHandle = Process.GetProcessesByName("winword")[0].MainWindowHandle;
Run Code Online (Sandbox Code Playgroud)
问题是代码的工作原理是假设没有其他Word运行实例.如果有多个,则无法保证它返回的句柄是针对我已启动的实例.我GetForegroundWindow在检测WindowActivate到来自我的对象的事件之后尝试使用但是这一切都在WPF应用程序中运行,该应用程序被设置为作为最顶层的窗口运行,所以我只获得了WPF窗口的句柄.有没有其他方法来获取我的单词实例的句柄?
我知道我可以通过调用.NET中的Debugger.IsAttached来查找是否正在调试进程,但是我希望能够获得调试进程的Visual Studio的PID.这可能吗?