2012-01-24 4 views
0

Я разрабатываю небольшую программу (dll) в Visual Studio 2010/.NET 4, которая интегрируется с внешним приложением (мы будем называть его ExApp) через COM-взаимодействие. Я сам создаю сборку interop, используя TlbImp.exe, так как ни один из них не предоставляется внешним приложением. ExApp поставляется в трех популярных версиях, каждый из которых имеет фактически идентичный API, но каждый из них имеет другую (и несовместимую) сгенерированную межпланетную DLL. На данный момент, это означает, что у меня есть три отдельных инсталляторов:Может ли установщик Windows развернуть сборку на основе версии внешнего приложения?

  • Установщик ж/my.dll встроенных/связанных с Interop.ExApp.dll v1
  • Installer ж/my.dll постройки/слинкованы Interop.ExApp.dll v2
  • Installer ж/my.dll постройки/связанное с Interop.ExApp.dll v3

Должно быть лучшее решение, чем это.

Как настроить установщик Visual Studio/Windows, так что мне нужен только один install .exe? Это означает, что установщик обнаружит версию ExApp и установит соответствующие версии my.dll и Interop.ExApp.dll.

И вопрос с бонусом: поскольку API ExApp не имеет значимого изменения, как я могу скомпилировать одну версию my.dll для работы с любой установленной версией ExApp?

+1

Позднее связывание с ключевым словом C# * dynamic * или vb.net является опцией в COM. В противном случае установщик должен вытолкнуть реестр, чтобы найти ключ CLSID. Это обычай. –

ответ

1

Почему вы не строите interops с 3 разными именами файлов, а затем создать фабричный шаблон в вашем приложении, чтобы решить, какой поставщик использовать во время выполнения?

Я могу показать вам способы поиска системы для установки одного из трех взаимоисключающих файлов, но я не думаю, что такая сложность принадлежит инсталлятору. И в любом случае он будет разваливаться, если кто-то обновит приложение, для которого вы создаете interop.

1

Возможно, вы указали в базе данных проекта Specific Version значение True или False? вы можете попробовать установить его на False, если его установить как True.

Это явно не помешало бы более новую версию от взлома (изменения API), но это, кажется, дело в настоящее время так или иначе

+0

К сожалению, это не позволяет my.dll вытаскивать другую версию Interop.ExApp.dll из GAC. Однако, проверяя эту идею, я обнаружил, что Interop.ExApp.dll v1 работает с ExApp v2, так что это полезно. –

+0

@ScottB Я не уверен, что вы имеете в виду, что должно позволить вам использовать вашу единственную DLL для всех трех версий, если API одинаковый. Какие ошибки вы получаете, если поместите эти dll (с установленной версией в false) на эти машины? – John

+0

Если я запустил my.dll, скомпилированный с Interop.ExApp.dll v1 (с определенной версией, установленным на false) на машине, где в GAC установлен только Interop.ExApp.dll v2, my.dll не работает с 'assembly not found' , –