C# Run CMD from website button
Я играю в Террарию. Я иногда устраиваю игры. Я хочу, чтобы пользователи могли захватить текущую карту моего мира, когда они захотят. Поэтому я создал простую веб-страницу, чтобы использовать MoreTerra (картографическое программное обеспечение) для создания карты в фоновом режиме для меня и веб-страницу для отображения карты пользователям.
MoreTerra поставляется с пакетным файлом, который запускается из командной строки. пакетный файл содержит следующее:
@ECHO OFF cmd.exe /c MoreTerra.exe %1 %2 %3 %4 @ECHO ON
Я хочу выполнить это, когда пользователь нажимает кнопку на моей веб-странице, поэтому я создал следующий код:
try { // declare variables string worldFile = "\"" + AppSettings.GetAppSetting("WorldFile", false) + "\""; string outputLocation = "\"" + AppSettings.GetAppSetting("OutputLocation", false) + @"\" + AppSettings.GetAppSetting("ImageFileName", false) + "\""; string fileName = AppSettings.GetAppSetting("MT_Location", false) + @"\" + "MoreTerraNoGui.bat"; ProcessStartInfo si = new ProcessStartInfo(); // define StartInfo si.FileName = @"C:\Windows\SysWOW64\cmd.exe"; si.Arguments = "/c " + fileName + " -w " + worldFile + " -o " + outputLocation; si.WorkingDirectory = AppSettings.GetAppSetting("MT_Location", false); si.CreateNoWindow = true; si.WindowStyle = ProcessWindowStyle.Hidden; si.UseShellExecute = false; si.RedirectStandardOutput = true; si.RedirectStandardError = true; // log arguments for debug check Log.WriteToLog(ProjectLogType, "btnRefresh_Click", si.Arguments, LogEnum.Debug); // start process and wait for it to finish Process subProcess = Process.Start(si); subProcess.WaitForExit(); // log output and errors string output = subProcess.StandardOutput.ReadToEnd(); string error = subProcess.StandardError.ReadToEnd(); Log.WriteToLog(ProjectLogType, "btnRefresh_Click", output, LogEnum.Debug); Log.WriteToLog(ProjectLogType, "btnRefresh_Click", error, LogEnum.Debug); } catch(Exception x) { Log.WriteToLog(ProjectLogType, "btnRefresh_Click", x, LogEnum.Critical); }
До сих пор это ничего не дало. В Диспетчере задач я вижу, как процесс Хоста окна консоли запускается и останавливается менее чем за секунду каждый раз, когда я нажимаю кнопку, но изображение не генерируется. Переменные вывода и ошибки всегда пусты. но когда я отлаживаю и ломаю на "подпроцессе.WaitForExit();" я вижу эту ошибку в окне Locals в Visual Studio
- MainModule 'subProcess.MainModule' threw an exception of type 'System.ComponentModel.Win32Exception' System.Diagnostics.ProcessModule {System.ComponentModel.Win32Exception} + base {"A 32 bit processes cannot access modules of a 64 bit process."} System.Runtime.InteropServices.ExternalException {System.ComponentModel.Win32Exception} NativeErrorCode 299 int
Я пробовал использовать то же самое cmd.exe как в коде C#, так и в пакетном файле, как x86, так и x64, но безрезультатно.
Я использовал corflags.exe чтобы проверить MoreTerra.exe, и это не 32-битный требуется, мой код компилируется для AnyCPU, так что я в реальной потере.
Я прочесал интернет, но все, что я нашел, включено в приведенный выше код.
Любая помощь будет очень признательна. ТИА