При разработке на C# COM-серверов для использования в MS Office встает проблема экспорта интерфейсов таким образом, чтобы обеспечить их совместимость с VBA. В C# / .Net имеется довольно небольшой набор средств, позволяющих управлять видом COM-интерфейсов и маршаллингом типов: атрибуты, кастомизированные маршаллеры и собственно синтаксис C# в сочетании с маршаллером по умолчанию. Однако этих средств недостаточно для того, чтобы реализовать некоторые типичные для VBA конструкции. Например, параметры-массивы или функции с необязательными параметрами.
Выход - не использовать Type Library, генерируемую средствами фрэймворк (.tlb файл), а писать свои определения интерфейсов на IDL. При помощи IDL можно описать любой интерфейс, поддерживаемый COM. Недостаток подохда в том, что написанный вручную IDL нужно синхронизировать с описанием интерфейса на C#. (В отличие от tlb, генерируемого по умолчанию, который синхронизируется с кодом автоматически во время сборки проекта.) Синхронизация IDL вручную чревата ошибками и требует много рутинной работы, объем которой растет вместе с ростом разрабатывамой библиотеки компонентов. Поэтому необходима утилита для генерации IDL на основе кода. Эту утилиту можно запускать при сборке, в том числе автоматической.
В принципе, большая часть библиотеки типов, генерируемой по умолчанию, пригодна для использования как есть; необходимо лишь внести изменения в нужных местах. Поэтому вместо полнофункционального генератора IDL можно написать утилиту проще - для модификации декомпилированного tlb на основе набора правил. Что и было сделано.
Для парсинга IDL я использовал регулярные выражения. Это удобно, потому что с их помощью можно задать неточную грамматику IDL, - то есть описать только нужные конструкции IDL, при этом можно даже не описывать отдельные токены, из которых они состоят. К тому же регулярные выражения можно ипользовать не только для парсинга текста, но и для его модификации.
В итоге получилась утилита командной строки - Replacer, - которая используется следующим образом:
Replacer.exe macros.xml
То есть набор параметров (входной и выходной файлы) и макросов поиска и замены (регулярных выражений) описывается в XML файле.
[Update]На данный момент подход уже используется продолжительное время, и позволил практически забыть о проблеме совместимости COM интерфейсов между C# и VBA.
Wednesday, November 30, 2005
Tuesday, November 29, 2005
Открытие блога!
Добро пожаловать в мой блог!
Здесь я планирую писать о том, что меня интересует, а значит, надо немного рассказать о своих интересах. Интересуют меня следующие темы:
- финансовые рынки, инвестиционный банкинг, трэйдинг
- информационные технологии, проектирование ПО, процесс разработки
- программирование финансовых приложений
Здесь я планирую писать о том, что меня интересует, а значит, надо немного рассказать о своих интересах. Интересуют меня следующие темы:
- финансовые рынки, инвестиционный банкинг, трэйдинг
- информационные технологии, проектирование ПО, процесс разработки
- программирование финансовых приложений
Subscribe to:
Posts (Atom)