Вот то, чем я жил -
Это зависит от того, для чего вы планируете использовать файлы DLL. Я делю их на две основные группы:
тупиковые сборки. Это EXE-файлы и DLL-файлы, ссылки на которые вы действительно не собираетесь нигде ссылаться. Просто слабо назовите их и убедитесь, что номера версий, которые вы выпускаете, помечены в source-control, чтобы вы могли выполнять откат в любое время.
Ссылочные сборки. Строгое имя, так что вы можете иметь несколько версий, на которые ссылаются другие сборки. Используйте полное имя для ссылки на них (Assembly.Load). Храните копию самой последней и лучшей версии в таком месте, где другой код может ссылаться на нее.
Далее, у вас есть выбор: копировать локальные ссылки или нет. В основном, компромисс сводится к - вы хотите использовать патчи / обновления из ваших ссылок? В этом может быть положительная ценность от получения новой функциональности, но, с другой стороны, могут быть серьезные изменения. Я считаю, что решение здесь должно приниматься в каждом конкретном случае.
При разработке в Visual Studio по умолчанию вы берете последнюю версию в скомпилировать с, но после компиляции ссылочная сборка потребует конкретной версии, с которой она была скомпилирована.
Ваше последнее решение - копировать локально или нет. По сути, если у вас уже есть механизм для развертывания указанной сборки, установите для этого параметра значение false.
Если вы планируете большую систему управления выпусками, вам, вероятно, придется уделить этому больше внимания и заботы. Для меня (небольшой магазин - два человека) это работает нормально. Мы знаем, что происходит, и не чувствуем себя сдержанными от необходимости делать вещи так, чтобы это не имело смысла.
Как только вы достигнете времени выполнения, вы Assembly.Load все, что вы хотите в домен приложения . Затем вы можете использовать Assembly.GetType для достижения нужного вам типа. Если у вас есть тип, который присутствует в нескольких загруженных сборках (например, в нескольких версиях одного и того же проекта), вы можете получить исключение AmbiguousMatchException . Чтобы решить эту проблему, вам нужно получить тип из экземпляра переменной сборки, а не статический метод Assembly.GetType.