none
Взаимодействие .NET и COM RRS feed

  • Вопрос

  • Добрый день!

    Помогите мне пожалуйста в понимании данного столь непростого вопроса:

    Как с помощью .NET написать такой класс, который мог бы быть создан с помощью функции CreateObject() в .vbs файлах, исполняемых с помощью Windows Script Host? И второй-как в .vbs файлах с помощью той же функции получить ссылку на объект, созданный в другой программе (как создание ссылки на, например, объект Outlook.Application)? 

    В решении данной задачи я продвинулся несильно, что запутало меня еще сильнее - я смог написать некий класс, который у меня получилось создать с помощью конструктора new ActiveXObject в JavaScript сценарии, который запускался из Internet Explorer.

    Объясните мне пожалуйста, что я делаю не так, и по возможности, напишите пожалуйста код для разработки данного класса в .NET языке (VB.NET\C#-без разницы) и код на Visual Basic Script, который мог бы работать под управлением WSH, или хотя бы объясните, почему это невозможно. Заранее 

    • Перемещено Abolmasov Dmitry 7 сентября 2011 г. 12:48 (От:Настольные ПК)
    10 августа 2011 г. 16:50

Ответы

  • http://msdn.microsoft.com/en-us/library/c3fd4a20 - Example COM Class (C# Programming Guide)
    http://www.gotdotnet.ru/forums/3/100694/478550/#post478550 - Запуск приложения из другого приложения
    • Помечено в качестве ответа Abolmasov Dmitry 12 августа 2011 г. 14:36
    12 августа 2011 г. 6:32
  • > нет ли каких-либо других способов?

    можно создать wsc-файл. примерный каркас ниже.
    и зарегистрировать как COM-объект. (см. контекстное меню файла: регистрация ...)
    из своей программы создается и работает как обычный COM-объект

    <component id="SchemaHost">
    <registration progid="Schema.Host"/>
    
    <public>
    	<method name="Transform"/>
    	<property name="HasErrors">
    		<get internalName="get_HasErrors"/>
    	</property>
    	<property name="PageXpath">
    		<get internalName="get_PageXpath"/>
    		<put internalName="set_PageXpath"/>
    	</property>
    </public>
    
    <script language="JScript">
    //**Start Encode**
    
    
    // предыдущая строка с * - это если понадобится зашифровать js
    // далее js-код
    
    
    </script>
    </component>
    


     

    • Помечено в качестве ответа Matyushov Anton 31 августа 2011 г. 10:54
    23 августа 2011 г. 17:25

Все ответы

  • http://msdn.microsoft.com/en-us/library/c3fd4a20 - Example COM Class (C# Programming Guide)
    http://www.gotdotnet.ru/forums/3/100694/478550/#post478550 - Запуск приложения из другого приложения
    • Помечено в качестве ответа Abolmasov Dmitry 12 августа 2011 г. 14:36
    12 августа 2011 г. 6:32
  • С созданием COM-объекта разобрался, все получилось. А вот насчет второго ответа - это немного не то, что я имел ввиду. Мне нужно создать из скрипта ссылку на объект, созданный в другой программе, и в скрипте с ним оперировать. Как это возможно сделать?
    17 августа 2011 г. 6:36
  • > Мне нужно создать из скрипта ссылку на объект, созданный в другой программе, и в скрипте с ним оперировать

    т.е. скрипт должен вызвать другую_программу. в ответ скрипт получит ссылку на объект, в котором есть свои свойства и фунции. эти функции и свойства должны быть доступны из скрипта. так?

    если есть доступ к исходнику другой_программы, то может проще встроить в нее javascript  
    см. Запуск JavaScript из .net программы - http://www.gotdotnet.ru/forums/2/23201/115222/#post115222


    P.S.
    - пример реализации свойств и исходящих событий в COM-объектах http://www.gotdotnet.ru/forums/4/22884/113721/#post113721
    - Передача данных между приложениями http://www.gotdotnet.ru/forums/2/22271/

    17 августа 2011 г. 10:30
  • Понятно. А может тогда еще подскажете, как мне запускать сценарии на VBS? Запуск процесса wscript.exe не подойдет.
    19 августа 2011 г. 11:17
  • > как мне запускать сценарии на VBS?

    т.е. есть vbs-файл и надо его выполнить, запустив из своей программы?

    19 августа 2011 г. 11:41
  • Не совсем. Например, есть какой-нибудь скрипт, и вписав его в программу как текст, можно его выполнить. Я знаю, что есть такая библиотека как msscriptcontrol, но она не поставляется вместе с Framework, а хотелось бы, чтобы был какой-либо встроенный класс для запуска vbs скриптов.
    20 августа 2011 г. 8:34
  • > ... есть такая библиотека как msscriptcontrol, но она не поставляется вместе с Framework

    можно использовать WebBrowser

    var wb = new WebBrowser();
    wb.DocumentText = "<script id='sc'>function Test() { alert(123); }</script>";
    wb.Document.InvokeScript("Test");
    

    • Предложено в качестве ответа Malobukv 20 августа 2011 г. 9:23
    20 августа 2011 г. 9:22
  • Спасибо за предложение, но нет ли каких-либо других способов?
    23 августа 2011 г. 12:32
  • > нет ли каких-либо других способов?

    можно создать wsc-файл. примерный каркас ниже.
    и зарегистрировать как COM-объект. (см. контекстное меню файла: регистрация ...)
    из своей программы создается и работает как обычный COM-объект

    <component id="SchemaHost">
    <registration progid="Schema.Host"/>
    
    <public>
    	<method name="Transform"/>
    	<property name="HasErrors">
    		<get internalName="get_HasErrors"/>
    	</property>
    	<property name="PageXpath">
    		<get internalName="get_PageXpath"/>
    		<put internalName="set_PageXpath"/>
    	</property>
    </public>
    
    <script language="JScript">
    //**Start Encode**
    
    
    // предыдущая строка с * - это если понадобится зашифровать js
    // далее js-код
    
    
    </script>
    </component>
    


     

    • Помечено в качестве ответа Matyushov Anton 31 августа 2011 г. 10:54
    23 августа 2011 г. 17:25
  • Спасибо огромное за пояснение, но, видимо, я некорректно поставил вопрос, либо просто чего-то недопонимаю. Еще раз: я хочу добавить в свое приложение, написанное на .net возможность скриптинга на каком-либо скриптовом языке(к примеру, vbscript), для того, чтобы пользователь мог написать скрипт, используя переданные туда программой-хостом объекты. Я знаю не одну программу, в которой данная возможность реализована, и знаю библиотеку, которая позволяет это сделать, но проблема заключается в том, что эта библиотека не входит в Framework, и её нужно регистрировать на всех клиентских ПК. Неужели в framework'e данной возможности нет? Ниже привожу кусок кода, который, как мне кажется, реализовывает данную возможность на отлично безо всяких там "финтов ушами" и танцев с бубнами:

     

    ...
    
    using MSScriptControl;
    
    using System.Windows.Forms;
    
     
    
    namespace ScriptHost
    
    {
    
     public class Executor
    
     {
    
     public void Execute(string scriptText,Form form)
    
     {
    
      ScriptControl control = new ScriptControl();
    
      control.Language = "VBScript";
    
      control.AddObject("Parent", form);
    
      control.ExecuteStatement(scriptText);
    
      }
    
     }
    
    }
    


     

    В принципе, все. Вот меня и удивляет, неужели такой богаты пакет как Framework не предусматривает такой возможности? Порывшись в метаданных MSScriptControl, я обнаружил, что он использует пространство имен System.Runtime.InteropServices, возможно в этом пространстве имен содержится какой-либо класс, который поможет решить данную задачу? Если нет, то все равно спасибо за ответы.

    24 августа 2011 г. 8:09
  • > есть такая библиотека как msscriptcontrol, но она не поставляется вместе с Framework [...] using MSScriptControl; [...]Порывшись в метаданных MSScriptControl, я обнаружил, что он использует пространство имен System.Runtime.InteropServices

    браузер состоит из компонентов/COM-объектов. один из компонентов - msscriptcontrol, предназначен для выполнения скриптов. т.е. везде, где есть браузер - есть компонент выполнения скриптов.
    для msscriptcontrol можно для удобства создать .NET-обертку (поэтому в сборке используются методы InteropServices)
    .NET-обертку можно подключить к проекту и использовать: using MSScriptControl; и т.д.

     




     

    24 августа 2011 г. 10:55
  • почему вы не хотите использовать WebBrowser? его можно использовать без вывода на экран. работает быстро. есть примеры использования на сервере, для создания скриншотов страниц. см пример
    24 августа 2011 г. 13:51
  • Спасибо, разобрался с WSC. Очень удобная вещь. Спасибо огромное за помощь!
    Regards, Matyushov Anton.
    31 августа 2011 г. 10:54