c# - 如果进程作为文件类型的默认关联程序启动,则出现 InvalidOperationException

标签 c# process invalidoperationexception

情况:

  1. 我依靠默认的关联处理程序为各种文件类型(图片、Word 文档等)生成进程。这意味着我仅将特定文件名指定为 StartInfo.FileName,并且该文件名之前没有实际的可执行文件。同时我指定 StartInfo.UseShellExecute = true。这样,与该文件类型相关的软件就会启动。
  2. 我的目标是在该进程退出时收到通知。


Process process = new Process();
try
{
    process.StartInfo.UseShellExecute = true;
    process.StartInfo.FileName = pFullPath;
    process.StartInfo.CreateNoWindow = true;
    process.StartInfo.RedirectStandardError = true;
    bool notReused = process.Start();
}
catch (Win32Exception ex)

变化:

  • Process 的静态 Start 方法确实返回一个 Process,但我为我的场景返回了 null/空对象。这就是为什么我显式实例化一个 Process 类,为其 StartInfo 属性设置参数,然后最后调用非静态 Start(),这样我就掌握了该 Process 对象实例。
  • 如果我说 StartInfo.UseShellExecute = false,则会出现异常,因为我没有指定可执行文件名称。看来这就是调用文件类型关联程序的方法。
  • 非静态的Process.Start有一个boolean返回值,它表明系统重用了一个Process。我不想这样,但我不知道如何避免。
  • 我尝试设置 StartInfo 的 Redirect* bool 值,但这再次引发 InvalidOperationException,并且符合文档。

如果我有一个“好的”Process 对象,我可以连接 Exited 处理程序并将 EnableRaisingEvents 设置为 true。我对 PITA 如此之大感到惊讶和悲伤。

最佳答案

这是完全不可能的。
启动文件并不能保证创建进程。

雷蒙德陈有far more detail .

关于c# - 如果进程作为文件类型的默认关联程序启动,则出现 InvalidOperationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14059060/

相关文章:

c# - 快速 Exp 计算 : possible to improve accuracy without losing too much performance?

Tomcat 处理时间

python - 使用 python 确保长时间运行的进程只执行一个进程

c - C 和 Perl 中的 system() 有什么区别?

c# - InvalidOperationException 与 ArgumentException

c# - 每隔一个 a-z 字母大写/小写,忽略空格

c# - 在 MVC 中上传文件时,字符串或二进制数据将被截断

c# - 使用 InvokeMember 通过 C# 在 Excel 中的文化特定属性

c# - InvalidOperationException - 对象当前正在别处使用 - 红十字

c# - 在 C# 中使用 foreach 循环时修改集合