Как автоматизировать приложение на C # с помощью консоли powershell? - PullRequest
2 голосов
/ 02 мая 2019

Контекст

У меня есть приложение 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 к первому пространству выполнения, а не создавать новое? Или, в качестве альтернативы, как принудительно ввести нужные переменные в пространство выполнения, созданное удаленными сеансами?

...