我有一个程序,它是制作课程的创作工具。我决定使用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?
如果需要更多信息,请告诉我,我会尽可能多地提供。我在这里和其他论坛上看到过类似的问题,但没有人给我答案。 谢谢,吉姆
答案 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的成功与现实世界中的失败之间的差异可能是某些上下文,例如当前的工作目录。但至少这将为您提供有关导致其崩溃的错误性质的信息。