Напишите адаптер или фасад, который обернет внешнюю DLL. Заставьте его реализовать интерфейс IExternalDLL (конечно, выберите более подходящее имя), который документирует / определяет ваши потребности из внешней DLL; он не должен точно имитировать сигнатуры функций фактической реализации.
Составьте набор «контрактных тестов» для интерфейса, как вы ожидаете, что интерфейс будет работать.
Теперь вы можете написать разные адаптеры для каждой версии - в случае некоторых переломных изменений с v1 на v2. Ваш клиент абстрагируется из-за интерфейса. Работа адаптера / фасада заключается в том, чтобы убедиться, что соответствующая версия dll соответствует контрактным тестам. Вы пишете один набор тестов и выполняете его со всеми реализациями адаптера / фасада.
В следующий раз, когда будет выпущена новая версия - вы можете
- используйте последний переходник / фасад, если он соответствует вашим потребностям
- развернуть новый, чтобы исправить любые критические изменения; убедитесь, что вы выполняете его в соответствии с контрактными тестами, чтобы ваш клиент не порвал с этим адаптером.