Как сделать .NET COM обертку универсальной - PullRequest
2 голосов
/ 06 августа 2010

Я думаю, что это история типа фабрики / провайдера, но я не знаю, как описать мою проблему.Это выглядит так.

InstallShield имеет интерфейс автоматизации COM, который они меняют с каждым выпуском.Если бы это был VBScript, я бы сказал

set project = CreateObject("ISWiAuto15.ISWiProject) ' InstallShield 2009
set project = CreateObject("ISWiAuto16.ISWiProject) ' InstallShield 2010

, как только у меня есть объект проекта, я могу делать такие вещи, как

project.OpenProject( filePath, readOnly )

В C # .NET 3.5 я добавляю свою ссылку COM и делаюто же самое, но теперь я тесно связан с этим классом.Я хочу быть в состоянии сделать что-то вроде

var project = CreateProjectObject( typeof ISWiAutoXX.ISWiProject )

Но я не могу понять, как это сделать, так как нет никакого общего интерфейса для приведения.

Мне не повезло или есть способ справиться с этим типом проблемы?

Ответы [ 5 ]

4 голосов
/ 06 августа 2010

Если вы используете только .NET 3.5, лучшим вариантом, вероятно, было бы написать свои собственные интерфейсы, которые предоставляют именно ту функциональность, которая вам требуется, а затем реализовать интерфейсы с использованием IS 2009 и IS 2010. Это позволяет вам использовать любыевнутреннюю реализацию и создайте фабричный метод (или используйте DI) для конструирования объектов.

К сожалению, это требует значительного количества простого прохождения (методы-обертки, которые просто вызывают объект COM).Однако это очень надежный и перспективный способ работы, позволяющий работать с простым, безопасным для типов API.

1 голос
/ 06 августа 2010

Если вы счастливы отказаться от безопасности типов, вам может помочь dynamic, но вы говорите, что она вам недоступна.

Но в более старых версиях языка вы можете приблизиться к dynamic, используя простой вспомогательный класс, чтобы скрыть шум отражения . Он не делает всего, что может сделать ключевое слово dynamic, но все же может работать для вас.

1 голос
/ 06 августа 2010

Если вы так склонны, вы можете настроить вызываемую оболочку во время выполнения так, чтобы имена типов оставались постоянными

0 голосов
/ 06 августа 2010

Используйте VB.NET для создания строго типизированной оболочки. Затем вы можете вызвать эту оболочку из вашего приложения C #.

0 голосов
/ 06 августа 2010

Обдумывая проблему, я думаю, что вижу возможное решение, сделанное по-другому, но немного эзотерично.

Ссылки являются частью файла msbuild (проекта) в ItemGroup. Вы можете сделать это внешним, имея эту конкретную ссылку в другом файле msbuild в проекте, включенном в proj-файл.

Наконец, вы можете сделать этот внешний файл MSBUILD T4 сгенерированным на основе некоторой логики, которая ищет интерфейс COM и определяет, что содержит ссылка.

...