Могу ли я создать переменные и запустить методы моих классов в 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 ответ

Решение

В вашем коде есть две проблемы:

  1. Вам нужно сделать User класс public, чтобы быть видимым для PowerShell.
  2. Вы должны использовать 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();
        }
    }
}
Другие вопросы по тегам