Пусть Powershell обработает список объектов из программы на C # - PullRequest
4 голосов
/ 30 марта 2011

Я хочу добавить средство в приложении ac #, где я могу:

1) Взять коллекцию объектов и передать ее в скрипт powershell из моего приложения c #

2) Пусть сценарий powershell внесет изменения в список объектов, которым он был передан

3) Вернуть этот список объектов обратно в c #

У меня есть внешний класс с именем Message

 public class Message 
    { 
        public String name { get; set; } 
        public String from { get; set; } 
        public String to { get; set; } 
        public String date { get; set; } 
        public String subject { get; set; } 
        public String body { get; set; } 
    } 

Я заполняю класс списка PSDataCollection следующим образом:

 PSDataCollection<Message> mlist = new PSDataCollection<Message>() 
          { 
              new Message {  to="user1", from="user2", date = "1/10/2010 12:00:00 AM EST", subject = "hi there" , body = "hi again" }, 
              new Message {  to="user1", from="user3", date = "1/10/2010 12:00:00 AM EST", subject = "new messages" , body = "new messages" } 
          } 

В скрипте powershell мы хотим, чтобы он: 1) Читал каждый объект 2) Настройте поле даты, добавив к нему 2 часа

Проблемы с реализацией:

Следующий код - наша попытка заставить его работать.Первая проблема, с которой мы столкнулись, заключалась в том, как импортировать класс Message из внешней DLL.

Мы пробовали это: добавить тип "G: \ testBAL \ bin \ Debug \ testBAL.dll", но получили ошибки

Любая помощь будет оценена.

namespace TestProject 
{ 
    class Program 
    { 
      static void Main(string[] args) 
        { 
            PSDataCollection<Message> mlist = new PSDataCollection<Message>() 
            { 
                new Message {  to="user1", from="user2", date = "1/10/2010 12:00:00 AM EST", subject = "hi there" , body = "hi again" }, 
                new Message {  to="user1", from="user3", date = "1/10/2010 12:00:00 AM EST", subject = "new messages" , body = "new messages" } 
            }; 
            mlist.Complete(); 

            PowerShell ps = PowerShell.Create() 
                .AddScript("Add-Type G:\testBAL\bin\Debug\testBAL.dll") 
                .AddCommand("Select-Object"); 

            IAsyncResult async = ps.BeginInvoke<Message>(mlist); 

            foreach(PSObject result in ps.EndInvoke(async)) 
            { 
                String to = ((Message)(result.BaseObject)).to; 
                Console.WriteLine("to=" + to); 
            } 
        } 
    } 
}

Ответы [ 3 ]

6 голосов
/ 30 марта 2011

Вы можете использовать PowerShell Runspace для установки и получения переменных в сеансе PowerShell, созданном в приложении .NET.Я изменил ваш параметр даты и удалил EST, чтобы его можно было легко проанализировать с помощью командлета PowerShell Get-Date.

HTH

Doug

var mlist = new PSDataCollection<Message>() 
{ 
    new Message {  to="user1", from="user2", date = "1/10/2010 12:00:00 AM", subject = "hi there" , body = "hi again" }, 
    new Message {  to="user1", from="user3", date = "1/10/2010 12:00:00 AM", subject = "new messages" , body = "new messages" } 
};

var rs = RunspaceFactory.CreateRunspace();
rs.Open();
rs.SessionStateProxy.SetVariable("list", mlist);
var ps = PowerShell.Create();
ps.Runspace = rs;

ps.AddScript(@"
    $list | ForEach {
        $_.date = (Get-Date($_.date)).AddHours(2)
    }   
");

ps.Invoke();

var result = rs.SessionStateProxy.GetVariable("list") as PSDataCollection<Message>;
foreach (var item in result)
{
    Console.WriteLine(item.date);
}
rs.Close();
0 голосов
/ 30 марта 2011

Я загрузил сборку C # в скрипт PowerShell и использовал ее так:

$dllPath = "C:\path\library.dll"
$tmp = [Reflection.Assembly]::LoadFile($dllPath)
$obj = new-object Namespace.LibraryClass()
0 голосов
/ 30 марта 2011

Из вашего описания видно, что вам не хватает ключа -Path.

Вы должны указать -Path при прямой передаче DLL.См. Справочную документацию здесь ... http://technet.microsoft.com/en-us/library/dd315241.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...