Запуск Windows Sandbox из управляемого кода
Я пытаюсь программно инициализировать Windows Sandbox. Моя цель - создать.wsb
config и запустите его. В настоящее время я использую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
не ждет запущенного процесса.