Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PowerShell передача параметров 
:(
    Опции темы
RastaDja
Дата 4.8.2011, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



   Доброго времени суток уважаемые форумчане.
   Долго думал - в какой раздел написать, решил сюда.
   Собственно проблема:
   Есть у меня класс в проекте WPF, который загружает элементы управления из файла (XML). Из этого же файла он загружает скрипты на PowerShell. Эти скрипты я записываю в Runspace своего PowerShell.
   У меня стоит задача, в скрипте получить доступ к данным элементов формы (например, прочитать текст из TextBox-ов), для этого я загружаю свои элементы на форму, создаю Runspace, в который загружаю свой скрипт, и в этот же Runspace передаю все контролы по именам - в качестве переменных.
   Вот псевдокод (без использования файла, только идея)
Код

using System.Management.Automation;
using System.Management.Automation.Runspaces;

namespace WpfApplication5
{
    public partial class TaskWnd : Window
    {
        readonly Runspace runspace;
                
        public TaskWnd( String path )
        {
            InitializeComponent();
            runspace = RunspaceFactory.CreateRunspace();
            runspace.RunspaceConfiguration.Scripts.Reset();
            // чтение файла конфигурации
            LoadConfig( path );
        }

        private void LoadConfig( String path )
        {
            String XAMLCode = "<Grid xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" \nxmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"><StackPanel><TextBox Name=\"textBox1\">Hello</TextBox><Button Content=\"button1\" Name=\"button1\"></Button><Button Content=\"button2\" Name=\"button2\"></Button></StackPanel></Grid>";
            //  добавляем элементы на форму
            UIElement rootElement;
            rootElement = (UIElement)XamlReader.Load(new XmlTextReader(new StringReader(XAMLCode)));
            this.UIContent.Children.Clear();
            this.UIContent.Children.Add(rootElement);

            // заполнение функциями 
            ScriptConfigurationEntry script = new ScriptConfigurationEntry("button2_Click", "$textBox1.Text");   //скрипт для обработки нажатия на кнопку
            runspace.RunspaceConfiguration.Scripts.Append(script);
            runspace.Open();

            //  Подключаем эти элементы к событиям
            ConnectObjectsToEvent(this);
           //  Добавляем эти элементы в Runspace PowerShell
            AddObjectsToRunspace(this);
        }

        private void AddObjectsToRunspace(FrameworkElement node)
        {
            System.Collections.IEnumerable allObj = LogicalTreeHelper.GetChildren(node);
            foreach (Object obj in allObj)
            {
                if (obj.GetType().ToString() == "System.Windows.Controls.Button")
                {
                    Button RefButton = (Button)obj;
                    runspace.SessionStateProxy.SetVariable(RefButton.Name, RefButton);
                }
                if (obj.GetType().ToString() == "System.Windows.Controls.TextBox")
                {
                    TextBox RefText = (TextBox)obj;
                    runspace.SessionStateProxy.SetVariable(RefText.Name, RefText);
                }
                try
                {
                    AddObjectsToRunspace((FrameworkElement)obj);
                }
                catch   //  исключение, если обьект не есть контейнером
                {
                }
            }
        }

        private void ConnectObjectsToEvent(DependencyObject node)
        {
            System.Collections.IEnumerable allObj = LogicalTreeHelper.GetChildren(node);
            foreach (Object obj in allObj)
            {
                if (obj.GetType().ToString() == "System.Windows.Controls.Button")
                {
                    Button RefButton = (Button)obj;
                    RefButton.Click += new RoutedEventHandler(all_Buttons_Click);
                }
                try
                {
                    ConnectObjectsToEvent((DependencyObject)obj);
                }
                catch   //  исключение, если обьект не есть контейнером
                {
                }
            }
        }

        //  общий обработчик для всех кнопок
        private void all_Buttons_Click(object sender, RoutedEventArgs e)
        {
            Button refButton = (Button)sender;
            string sFuncName = String.Format("{0}_{1}", refButton.Name, "Click");
            Pipeline pl = runspace.CreatePipeline(sFuncName);
            try
            {
                Collection<PSObject> objs = pl.Invoke();    //   <-----------  вот тут
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

   В коде стрелочкой обозначено, где я хочу получить данные из TextBox, но почему-то получаю Null, хотя точно знаю что поле не пустое. Также возникает исключение - cross thread - если я в скрипте пропишу что-то такое $button1.Content=\"hello\".
   Подскажите, что в коде не так? Правильно ли я передал переменные в Runspace. И как обойти проблемы с работой в разных потоках.
   Спасибо.


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 5.8.2011, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Ну подскажите. Может кто знает, почему я не могу обратится к объекту в скрипте? Как правильно работать?


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0481 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.