Я разрабатываю управляемое приложение на C++, которое будет взаимодействовать с продуктом другой компании. Их продукт основан на сети .net, а основной API для использования - сборка .net, называемая foo.dll.Как я могу использовать сборку .net из каталога bin другого приложения, если это не в GAC?
Мое приложение требует, чтобы их продукт/ы устанавливались первым. Установка своих продуктов yeilds три различных приложения, каждый из которых в тир собственный каталог, каждый со своей директории собственный/BIN, и каждый с локальными копиями одного и того же DLL-файлы, так что вы можете найти:
C:\company\product1\bin\foo.dll
C:\company\product2\bin\foo.dll
C:\company\product3\bin\foo.dll
компании рассказывал нам которые использовать .dll, и какие из них они не добавили в GAC при установке своего продукта. В настоящее время я могу запустить свое приложение, скопировав их .dll в мой каталог bin после его создания. Теперь, когда я ищу создать установщик для своего продукта, мне сложно найти элегантный способ справиться с этим. Предполагая, что их API не изменится, я должен работать с большинством версий своего продукта, если у меня есть .dll, который совпадает с тем, который использует их продукт на этом компьютере.
Очевидно, что идеальным решением было бы разместить эти сборки в GAC при установке их продукта, в частности, поскольку они делят их сами, но это вряд ли произойдет, поскольку их продукт все еще незрелый, с много более важных проблем, и то, что они делают, работает для них.
Итак, у меня возникла проблема с тем, как найти и использовать .dll Мне нужно, когда я устанавливаю свой продукт. Варианты я придумал до сих пор являются следующие:
Включите их .dlls в мой инсталлятор
- Bad, потому что это блокирует меня к определенной сборки их программного обеспечения, и мы «В любом случае, получение инкрементных разработок от них будет невозможно, что не будет соответствовать их публичному выпуску.
Попросите моего установщика найти каталог установки и запустить gacutil.exe и все, что необходимо для размещения .dlls в GAC.
- Плохо, потому что gacutil.exe предназначен только для разработки, а это значит, что мы должны включить его в наш установщик и установить его вместе с нашим собственным продуктом. Это также может помешать их продуктам найти сборки.
Попросите моего установщика найти каталог установки и скопировать DLL-файлы в мои собственные каталоги.
- Простой, он работает, но является неэлегантным и означает, что мое приложение может сломаться, если у его продукта есть хотя бы незначительное обновление, до тех пор, пока не будут скопированы новые .dll. Я также хотел бы избежать необходимости копировать файлы.
Используйте код, который я нашел в http://www.roelvanlisdonk.nl/?p=713, чтобы программно добавить каталог своей установки в путь поиска .net в моем приложении во время выполнения.
- Разумный простой, если он работает, но больше кода для обслуживания. Пока это единственный путь для автоматической загрузки DLL из их каталога.
Managed C++ и .NET все еще относительно новое для меня, большая часть моего кодирования была линукс на основе C++. Я чувствую, что это будет очень сложно, потому что другая компания неправильно управляет тем, как они используют свои сборки .net, если они хотят, чтобы другие люди могли развиваться против них.
Кто-нибудь, у кого больше опыта, имел дело с чем-то подобным и нашел способ обойти его?
Фантастический вопрос! –
Вы уже ответили на свой вопрос. Копирование DLL во время установки - плохая идея. Загрузка его из какого-либо другого каталога во время выполнения является идеей * хуже *. Потому что теперь они могут разорвать ваше приложение в любое время. Не делай этого. –
Что это за их продукт, который требует его установки перед вашим? Я думаю, что ваш лучший вариант - отправить DLL, с которыми вы строили. Если они должны соответствовать установленному продукту с определенными уровнями совместимости, то ваш установщик должен проверить совместимые версии * product *, а не пытаться поделиться фактическими бинарниками, изменения которых могут привести к повреждению вашего приложения. – shambulator