Могу ли я создать переменные и запустить методы моих классов в PowerShell, размещенном мной?
PowerShell 4.0
Я хочу разместить движок PowerShell в своем приложении и иметь возможность использовать API своего приложения в размещенном PowerShell. Я прочитал описание класса PowerShell и его членов в документации. в PowerShell.exe
а также PowerShell_ISE.exe
хосты, на которых я могу создавать переменные, циклы, запускать статические методы и методы экземпляров моих классов. Могу ли я сделать то же самое через PowerShell
учебный класс? Я не могу найти примеры об этом.
Это моя простая попытка сделать это:
using System;
using System.Linq;
using System.Management.Automation;
namespace MyPowerShellApp {
class User {
public static string StaticHello() {
return "Hello from the static method!";
}
public string InstanceHello() {
return "Hello from the instance method!";
}
}
class Program {
static void Main(string[] args) {
using (PowerShell ps = PowerShell.Create()) {
ps.AddCommand("[MyPowerShellApp.User]::StaticHello");
// TODO: here I get the CommandNotFoundException exception
foreach (PSObject result in ps.Invoke()) {
Console.WriteLine(result.Members.First());
}
}
Console.WriteLine("Press any key for exit...");
Console.ReadKey();
}
}
}
1 ответ
Решение
В вашем коде есть две проблемы:
- Вам нужно сделать
User
класс public, чтобы быть видимым для PowerShell. - Вы должны использовать
AddScript
вместоAddCommand
,
Этот код будет вызывать два метода User
Класс и распечатать результирующие строки в консоли:
using System;
using System.Management.Automation;
namespace MyPowerShellApp {
public class User {
public static string StaticHello() {
return "Hello from the static method!";
}
public string InstanceHello() {
return "Hello from the instance method!";
}
}
class Program {
static void Main(string[] args) {
using (PowerShell ps = PowerShell.Create()) {
ps.AddScript("[MyPowerShellApp.User]::StaticHello();(New-Object MyPowerShellApp.User).InstanceHello()");
foreach (PSObject result in ps.Invoke()) {
Console.WriteLine(result);
}
}
Console.WriteLine("Press any key for exit...");
Console.ReadKey();
}
}
}