我在winforms中有一个按钮,单击该按钮需要运行批处理文件并打开exe(monitor.exe
)文件。批处理文件片段:-
@echo on
rem @echo $Id: runnit_navigator.bat,v X.X XXXX/XX/XX XX:XX:XX sxxxaxx Exp $
echo Running runnit_monitor.bat >%TEMP%\runnit_monitor.log
if exist "%CD%\Config.bat" (
call Config.bat >>%TEMP%\runnit_monitor.log
)
if "%1%" NEQ "" (
set SPACE_SITE=%1%
)
@set monitor_start=Y
rem if not defined SPACE_CONFIG (
rem set SPACE_CONFIG=%TEMP%
rem )
if not exist "%PROGRAMDATA%\space\config\%SPACE_SITE% \monitor.properties" (
set SPACE_SITE=NA
)
if "%SPACE_SITE%" EQU "NA" (
call "%SPACE_HOME%\Runnit\runnit_site_monitor.bat" >>%TEMP%\runnit_monitor.log
exit
)
set SPACE_SETTINGS=%PROGRAMDATA%\space\config\%SPACE_SITE%
@set JAVA_EXE=%LoginDialogJavaHome%\bin\monitor.exe
我已经尝试过此代码,没有错误,但是exe文件根本没有打开。
Process proc = new Process();
private void btn1_Click(object sender, EventArgs e)
{
try
{
string batDir = string.Format(@"C:\Program Files\Space\Runnit\");
proc.StartInfo.WorkingDirectory = batDir;
proc.StartInfo.FileName = "runnit_monitor.bat";
proc.StartInfo.CreateNoWindow = false;
proc.Start();
proc.WaitForExit();
proc.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace.ToString());
}
}
这也是上面代码的输出。弹出该窗口后,没有任何反应。但是当我设置一个断点时,我可以看到某些Process
属性返回一个异常。
我调用过程的方式是否错误?还是对读取批处理文件后让monitor.exe
运行有什么建议?
答案 0 :(得分:0)
我通过引用这些链接找到了答案。
从here(感谢@FredM btw),我知道问题是因为我正在从32位进程访问64位进程。我可以通过捕获Win32Exception
属性来看到错误。
catch (Win32Exception w)
{
MessageBox.Show(w.Message);
MessageBox.Show(w.NativeErrorCode.ToString());
}
然后,我找到了一种纠正此here的方法。我不以32位应用程序的形式编译和运行程序。我只是取消勾选Project-> Build properties下的宁愿32位选项。
最后,我进行了重建,并且运行良好! monitor.exe
文件现在可以成功运行。