我有一个带有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控制台连接到第一个运行空间而不创建新的运行空间? 或者,或者,如何将我想要的变量强加到由远程会话创建的运行空间中?