Лучший отвечающий
Взаимодействие .NET и COM

Вопрос
-
Добрый день!
Помогите мне пожалуйста в понимании данного столь непростого вопроса:
Как с помощью .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