如何使用Powershell控制台自动化C#应用程序?

时间:2019-05-02 14:38:41

标签: c# powershell runspace

上下文

我有一个带有GUI的C#应用​​程序,供标准用户使用,但对于高级用户,我想提供一个命令行,以允许操作该应用程序中的所有对象。我的想法是为此使用powershell。 如果我可以在我的应用程序中运行powershell引擎,并且可以给该引擎一个变量,该变量是我的应用程序的根对象,那么如果我可以使用powershell控制台连接到我的应用程序中的托管引擎,那么我可以做任何事情我想要。这样,我便可以为高级用户提供功能强大的命令行。

试用版

我已经了解到Powershell引擎是可托管的,因此我的理解是我可以“在进程中”运行该引擎,以便它可以不编组地访问我的对象。 我想出了这段代码来启动Powershell引擎。

alpha

这有效地启动了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();
        }
    }
}

我将控制台连接到我的应用程序,但看不到我的根变量。 如果我枚举主机进程中的运行空间是这样的:

PS C:\Users\Lionel> Enter-PSHostProcess consoleapp1
[Processus :23788]: PS C:\Users\Lionel\Documents> dir variable:

我看到2个运行空间,第一个是我启动的空间,第二个是在连接Powershell控制台时创建的空间。 如果我这样看第一个运行空间:

[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

我清楚地看到了我的根变量。

问题

所以我的问题是,如何将Powershell控制台连接到第一个运行空间而不创建新的运行空间? 或者,或者,如何将我想要的变量强加到由远程会话创建的运行空间中?

0 个答案:

没有答案