Запуск Windows Sandbox из управляемого кода

Я пытаюсь программно инициализировать Windows Sandbox. Моя цель - создать.wsbconfig и запустите его. В настоящее время я используюProcess.Start() метод, но я продолжаю получать сообщение об ошибке Start() метод.

Это код:

var sbProc = new Process();
sbProc.StartInfo.FileName = configPath;
sbProc.Start();
sbProc.WaitForExit();

Броски: System.ComponentModel.Win32Exception: 'Application not found'.

Я уверен, что файл существует, поскольку я пытался открыть его двойным щелчком и через командную строку. Оба работали, как ожидалось, поэтому я предполагаю, что это относится к соответствующему приложению (в данном случае Windows Sandbox).

Я пробовал добавить:

sbProc.StartInfo.UseShellExecute = false;

Броски: System.ComponentModel.Win32Exception: 'The specified executable is not a valid application for this OS platform.'.

Это то же исключение, но другое сообщение, которое на самом деле очень сбивает с толку. Как было сказано выше, я на 100% уверен, что моя ОС поддерживает эту функцию; все требования поддерживаются и активируются. Возможно ли, чтоProcess.Start() не могу справиться .wsbфайлы, и если да, то как я могу достичь того, что ищу?

Я открыт для любых предложений и заранее благодарен!

ОБНОВИТЬ:

Я пробовал изменить глагол на Invoke а также Start со следующим кодом:

sbProc.StartInfo.Verb = "Start";

а также

sbProc.StartInfo.Verb = "Invoke";

Броски:System.ComponentModel.Win32Exception: 'No application is associated with the specified file for this operation'

Как я могу связать и приложение с файлом?

1 ответ

Решение

Windows Sandbox работает двойным щелчком в проводнике и cmd.exe /c start, но не удалось запустить программно в приложении C#. Причина в том, что приложение C# было 32-битным, а ОС - 64-битным.

Когда 32-битное приложение пыталось вызвать конфигурацию песочницы, оно (косвенно) пыталось вызвать %windir%\System32\WindowsSandbox.exeисполняемый файл. НО! Когда 32-битное приложение пытается получить доступ%windir%\System32в 64-битной Windows перенаправляется на%windir%\SysWOW64 который содержит 32-битные версии системных приложений и библиотек DLL. Поскольку нет 32-битногоWindowsSandbox.exe,.NET framework выдавал исключения System.ComponentModel.Win32Exception: 'Application not found'.

Есть два способа запустить 64-битные системные приложения из 32-битных пользовательских приложений.

План А

Использовать %windir%\Sysnativeдорожка. Он доступен только для 32-битных приложений и разрешает истинный 64-битныйSystem32 системная папка.

var sbProc = new Process();
sbProc.StartInfo.FileName = "%SystemRoot%\Sysnative\WindowsSandbox.exe";
sbProc.StartInfo.Arguments = "\"" +configPath + "\"";
sbProc.StartInfo.UseShellExecute = true;
sbProc.Start();
sbProc.WaitForExit();

Я думаю, в этом случае WaitForExitбудет ждать завершения песочницы. Я не уверен на 100%, что-то может случиться в Windows, но ожидаю.

План б

План A имеет следующий риск: если в будущем люди MS переименуют исполняемый файл для песочницы или добавят дополнительные переключатели CLI, прямой вызов может потерпеть неудачу. Вам придется изменить свой код.

Чтобы избежать этого, вы можете использовать cmd.exe запустить песочницу start команда. cmd.exe может вызывать 64-битные системные приложения за кулисами.

var sbProc = new Process();
sbProc.StartInfo.FileName = "cmd";
sbProc.StartInfo.Arguments = "/c start \"\" \"" +configPath + "\"";
sbProc.StartInfo.Start();
sbProc.WaitForExit();

Единственная проблема в том, что WaitForExit вернется, как только start отделка, а не песочница. start не ждет запущенного процесса.

Другие вопросы по тегам