
Как получить доступ к COM с помощью скриптов? Просто короткая статья, чтобы показать несколько примеров кода и описать несколько нюансов. Я использую три широко используемых скриптовых языка — Python, VBScript и JScript.
Сначала создайте образец DLL и зарегистрируйте его как COM-объект. Назовите наш COM-объект как MyCOMObject.
Здесь вы можете увидеть несколько атрибутов:
[ComVisible(true)] не является обязательным, но если ваши решения состоят из более чем одного класса, каждый из этих классов является COM-видимым. По умолчанию все общедоступные методы общедоступных классов и все общедоступные классы видимы для COM. Это вызывает ненужное засорение реестра и раздувает библиотеку типов. Параметр ComVisible(false) делает класс COM-невидимым и уменьшает количество видимых COM-классов.
Параметр [ClassInterface(ClassInterfaceType.None)]] подавляет создание интерфейсов для класса. Подробное объяснение проблемы читайте в статье Мэйсона Бендиксена:
ProgIdarrtribute является обязательным, если вы хотите, чтобы ваша библиотека была доступна не только по GUID, но и по красивому имени.
Теперь расширим единственный класс нашей библиотеки, создав метод Dot(), который будет умножать числа. Здесь я должен обсудить один важный момент: какого типа должны быть числа? Очевидно, что Dot-метод принимает список/массив, потому что мы не ограничиваем количество входящих множителей. И это проблема. Список Python, список VBScript, список CS — все это разные объекты.
Конечно, мы можем заставить Dot-метод принимать строковый аргумент, например
string argument = "10, 0.3, 145";
В этом случае метод должен анализировать входящую строку, чтобы разделить значения и преобразовать их в двойные (обратите внимание на десятичный разделитель):
double[] doubles = argument.Split(',')
.Select(s => double.Parse(s, CultureInfo.InvariantCulture))
.ToArray();
Это нормально, но давайте попробуем использовать список-объект. Мы можем использовать System.Collections.ArrayList:
Чтобы создать ArrayList с помощью скрипта, подключитесь к соответствующему COM-объекту с именем System.Collections.ArrayList.
Здесь я должен описать, как получить доступ к COM. Python — самый гибкий язык, на мой вкус, поэтому я начинаю с него. Используйте модуль win32com для работы с COM:
from win32com import client
# Connect to COM by it's name
lib = client.Dispatch('MyCOMobject')
# Or by using GUID
lib = client.Dispatch('{36E6BC94-308C-4952-84E6-109041990EF7}')
VBscript использует функцию CreateObject для подключения к COM-объекту:
set lib = CreateObject("MyCOMobject")
И, наконец, JScript, где вызов COM основан на функции ActiveXObject:
var lib = new ActiveXObject("MyCOMobject")
Итак, в наших скриптах мы будем использовать два COM-объекта: System.Collections.ArrayList и наш собственный MyCOMobject. Первый заключается в создании ArrayList и использовании его в качестве аргумента для второго метода с именем Dot(System.Collections.ArrayList argument).
Ниже приведен список скриптов Python:
VB-скрипт:
И JScript:
Вот и все!
Вот проект на GitHub
Несколько замечаний:
- Не забудьте зарегистрировать свою COM-библиотеку. Если вы используете VisualStudio, вы можете включить опцию Зарегистрировать как COM в свойствах сборки, чтобы ваша библиотека была зарегистрирована автоматически сразу после сборки ИЛИ использовать RegAsm.exe
- Обратите внимание на версию интерпретатора Python и, соответственно, модуля win32com: бит-64 или бит-86. Дополнительную информацию я нашел в треде StackOverflow.
Ваше здоровье!