2016-04-10 24 views
-1

我有一个调用其他控制台应用程序的控制台应用程序。C#Process.Start - 如何执行WaitForExit

我使用下面的链接HOWTO:https://robindotnet.wordpress.com/2010/03/21/how-to-pass-arguments-to-an-offline-clickonce-application/

我不能实例化过程和使用,作为我收到错误消息“指定的可执行文件是不是这个操作系统平台的有效应用。”

我可以使用Process的静态版本调用应用程序。

Process.Start(shortcutPath, arguments); 

Process.Start(shortcutPath, arguments).WaitForExit(); 

但是,我不能得到的过程WaitForExit - 一个应用程序被称为过了一会,第一个应用程序完成之前,第二个被称为 - 这是一个问题因为它取决于第一个应用程序来完成。

如何获取过程的静态版本等待退出任何建议(ALT,如何实例化进程,并能够调用的ClickOnce部署的应用程序吗?)

+0

您的变量名为'shortcutPath'。你开始一个快捷方式('.lnk'文件)还是一个可执行文件('.exe'文件)? – yaakov

+0

当您部署clickonce应用程序时,最终会得到一个指向MS部署实际exe文件的引用。我打电话给这个appref。 它看起来像这样:C:\ Users \ User Name \ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs \ xxx \ xxx \ xxx.appref-ms –

+0

我可以去搜索这些exe文件并执行正常process.start的事情,但每次我重新部署被调用的应用程序,我必须更新调用应用程序中的文件路径,并重新部署。 –

回答

0

好,扑我的头一天中最好的部分墙后,我发现这... Start an offline ClickOnce Application and wait for Exit

使用了互斥选项。 Fek我微软,你已经采取了一些过去非常简单的事情,并且制造出一匹真正的马匹。

我正要放弃我的被调用的exe并创建一个怪物 - 在思想上感到不适。

0

的Process.Start方法(字符串,字符串)有这是根据https://msdn.microsoft.com/en-us/library/h6ak8zt5%28v=vs.110%29.aspx的System.Diagnostics.Process

的返回值是:

与该过程中资源相关联的新进程,或NULL如果没有进程资源开始。请注意,与已运行的相同进程的实例一起启动的新进程将独立于其他进程。另外,Start可能会返回一个非空的Process,其HasExited属性已设置为true。在这种情况下,启动的进程可能已激活其自身的现有实例,然后退出。

所以我会检查process.HasExited是否是真正的调用WaitForExit

var process = Process.Start(shortcutPath, arguments); 
if (process != null && process.HasExited != true) 
{ 
    process.WaitForExit(); 
} 
else 
{ 
    // Process is null or have exited 
} 
+0

您可以在已经退出的进程上调用WaitForExit。如果你不能,这段代码会引入竞争条件。 – yaakov

+0

foobar - 试过了。它没有任何区别 - 处理只是继续下一个呼叫。如果我单步执行代码并尝试查看过程变量的值,我会得到“BasePriority ='process.BasePriority'引发了一个类型为'System.InvalidOperationException'的异常。尽管代码位于try/catch块中,但不会引发异常... –

+0

注意:即使调查过程var也会引发错误,所调用的exe文件不带probs运行。 –