Контекст
У меня есть приложение C # с графическим интерфейсом для обычных пользователей, но для опытных пользователей я хочу предоставить командную строку, которая позволит манипулировать всеми объектами в приложении. Моя идея состоит в том, чтобы использовать PowerShell для этого.
Если я могу запустить механизм powershell внутри своего приложения и дать этому механизму переменную, которая является корневым объектом моего приложения, то, если я смогу получить консоль powershell для подключения к размещенному в моем приложении движку, я мог бы сделать что угодно Я хочу. Это позволило бы мне предоставить мощную командную строку для моих опытных пользователей.
Испытания
Я прочитал, что механизм powershell является хостом, так что я понимаю, что могу запустить двигатель "в процессе", чтобы он мог обращаться к моим объектам без маршалинга.
Я придумал этот код для запуска двигателя powershell.
using System.Management.Automation.Runspaces;
namespace ConsoleApp1
{
public class Program
{
public double A = 10;
public string B = "toto";
static void Main(string[] args)
{
var ist = InitialSessionState.Create();
ist.Variables.Add(new SessionStateVariableEntry("root", new Program(), "root object"));
var r = RunspaceFactory.CreateRunspace(ist);
r.Open();
Console.ReadLine();
}
}
}
Это эффективно запускает механизм powershell, а затем я могу подключиться с помощью консоли powershell.
PS C:\Users\Lionel> Enter-PSHostProcess consoleapp1
[Processus :23788]: PS C:\Users\Lionel\Documents> dir variable:
Я подключаю консоль к своему приложению, но не вижу свою корневую переменную.
Если я перечислю пространства выполнения в хост-процессе следующим образом:
[Processus :23788]: PS C:\Users\Lionel\Documents> get-runspace
Id Name ComputerName Type State Availability
-- ---- ------------ ---- ----- ------------
1 Runspace1 localhost Local Opened Available
2 RemoteHost localhost Local Opened Busy
Я вижу 2 пространства выполнения: первое - это то, которое я запустил, а второе - то, которое было создано, когда я подключил консоль PowerShell.
Если я загляну в первое пространство выполнения так:
[Processus :23788]: PS C:\Users\Lionel\Documents> (get-runspace -id 1).SessionStateProxy.GetVariable("root")
A B
- -
10 toto
Я ясно вижу свою корневую переменную.
Вопросы
Итак, моя проблема в том, как подключить консоль PowerShell к первому пространству выполнения, а не создавать новое?
Или, в качестве альтернативы, как принудительно ввести нужные переменные в пространство выполнения, созданное удаленными сеансами?