c #windows应用程序在visual studio中启动外部exe文件,但在安装时不启动

时间:2014-02-18 15:53:29

标签: c# process installer exe

我有一个程序,它是制作课程的创作工具。我决定使用camstudio为它创建一个屏幕录制功能。我用来启动exe的代码是:

Process process = new Process();
process.StartInfo.FileName = "Recorder.exe";
process.StartInfo.Arguments = "";
process.Start();

当我在visual studio中运行程序并逐步执行代码时,它可以正常工作并启动recorder.exe而没有错误。但是当我在visual studio 2010中为项目安装程序并安装程序时,当我按下应该启动recorder.exe的按钮时程序崩溃。

我检查了Windows错误日志,这是它告诉我的内容:

  

应用程序:Perform.exe Framework版本:v4.0.30319描述:   由于未处理的异常,该过程终止。   异常信息:System.ComponentModel.Win32Exception Stack:at   System.Diagnostics.Process.StartWithShellExecuteEx(System.Diagnostics.ProcessStartInfo)   在System.Diagnostics.Process.Start()at   P2Designer.Window1.scriptUpdatePerform(System.Object的,   System.Windows.RoutedEventArgs)at   System.Windows.RoutedEventHandlerInfo.InvokeHandler(System.Object的,   System.Windows.RoutedEventArgs)at   System.Windows.EventRoute.InvokeHandlersImpl(System.Object的,   System.Windows.RoutedEventArgs,Boolean)at   System.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject,   System.Windows.RoutedEventArgs)at   System.Windows.UIElement.RaiseEvent(System.Windows.RoutedEventArgs)at at   DevComponents.WpfRibbon.ButtonDropDown.OnClick()at   DevComponents.WpfRibbon.ButtonDropDown.x984587de9d70aaba(System.Object的)   在   System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate,   System.Object,Int32)at   MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object的,   System.Delegate,System.Object,Int32,System.Delegate)at   System.Windows.Threading.DispatcherOperation.InvokeImpl()at   System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(System.Object的)   在   System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext,   System.Threading.ContextCallback,System.Object,Boolean)at   System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,   System.Threading.ContextCallback,System.Object,Boolean)at   System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,   System.Threading.ContextCallback,System.Object)at   System.Windows.Threading.DispatcherOperation.Invoke()at   System.Windows.Threading.Dispatcher.ProcessQueue()at   System.Windows.Threading.Dispatcher.WndProcHook(IntPtr,Int32,IntPtr,   IntPtr,布尔ByRef)在MS.Win32.HwndWrapper.WndProc(IntPtr,Int32,   IntPtr,IntPtr,Boolean ByRef)at   MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)at at   System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate,   System.Object,Int32)at   MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object的,   System.Delegate,System.Object,Int32,System.Delegate)at   System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority,   System.TimeSpan,System.Delegate,System.Object,Int32)at   MS.Win32.HwndSubclass.SubclassWndProc(IntPtr,Int32,IntPtr,IntPtr)   在   MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG   ByRef)at   System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)   在   System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)   在System.Windows.Threading.Dispatcher.Run()处   System.Windows.Application.RunDispatcher(System.Object)at   System.Windows.Application.RunInternal(System.Windows.Window)at   System.Windows.Application.Run(System.Windows.Window)at   P2Designer.App.Main()

中的System.Windows.Application.Run()

在此处找到类似的未回答的问题:Why i'm getting a win32exception once i'm starting the Process?

如果需要更多信息,请告诉我,我会尽可能多地提供。我在这里和其他论坛上看到过类似的问题,但没有人给我答案。 谢谢,吉姆

2 个答案:

答案 0 :(得分:2)

(根据Josh Gallagher的建议,将评论作为答案重新发布)

这可能是当前工作目录(cwd)的问题。 IIRC,VS在调试中启动exe时实际上将cwd设置为输出文件夹。但是,在读取世界中,cwd实际上取决于exe的启动方式,并不一定指向目标exe所在的文件夹。

您可以通过简单地编写Environment.CurrentWorkingDirectory(或类似的东西)的值来轻松地测试它,并查看它指向的内容。或者在故障排除时尝试硬编码完整路径。无论哪种方式,我的钱都在你的执行背景是错误的目的。

答案 1 :(得分:0)

将代码包装在

try
{
  Process process = new Process();
  process.StartInfo.FileName = "Recorder.exe";
  process.StartInfo.Arguments = "";
  process.Start();
}
catch(Exception e)
{
   //Log using your logger the full error message.
}

这将告诉您程序出现故障的原因。 VS的成功与现实世界中的失败之间的差异可能是某些上下文,例如当前的工作目录。但至少这将为您提供有关导致其崩溃的错误性质的信息。