Как получить доступ к 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



Несколько замечаний:

  1. Не забудьте зарегистрировать свою COM-библиотеку. Если вы используете VisualStudio, вы можете включить опцию Зарегистрировать как COM в свойствах сборки, чтобы ваша библиотека была зарегистрирована автоматически сразу после сборки ИЛИ использовать RegAsm.exe
  2. Обратите внимание на версию интерпретатора Python и, соответственно, модуля win32com: бит-64 или бит-86. Дополнительную информацию я нашел в треде StackOverflow.

Ваше здоровье!