У меня есть решение, содержащее множество проектов и инсталляторов. Один проект использует сторонний пакет. Пакет поставляется с собственной DLL и DLL-оболочкой .net. Чтобы код работал, DLL-оболочке .net необходимо найти собственную DLL во время выполнения. Но код никогда не ссылается непосредственно на нативную DLL во время компиляции (код обращается к DLL-оболочке .net во время компиляции).
Теперь мне нужно выбрать правильный способ развертывания собственной библиотеки DLL во время компиляции на компьютере программиста и во время установки на компьютере пользователя.
По сути, у меня есть два варианта: поместить собственную DLL в системную папку Windows или поместить собственную DLL в локальную папку, содержащую exe-файл.
Чтобы поместить собственную DLL в системную папку, мне нужен сценарий после сборки, чтобы скопировать файл в каталог после построения решения. Мне также нужно создать системную папку в проекте установщика, чтобы установщик мог работать на клиентском компьютере. Я не знаю, является ли копирование файлов в системную папку хорошей идеей или нет. Для этого решения каждый раз, когда кто-то (еще в большой команде) создает новый установщик, он или она должны помнить, что нужно создать выход системной папки и добавить собственную DLL в конфигурацию, в противном случае его установщик не установит работоспособную часть программное обеспечение на компьютере пользователя.
Чтобы поместить собственную DLL в локальную папку, у меня есть два следующих способа:
1. Используйте сценарий после сборки. В этом решении я должен найти каждый исполняемый проект в моем большом решении, в котором есть ссылка на проект с использованием собственной библиотеки DLL, и связать сценарий после сборки с каждым таким исполняемым проектом. В будущем, когда кто-то (еще в большой команде) создаст новый исполняемый проект того же типа, он или она должны помнить, чтобы связать тот же сценарий после сборки, иначе исполняемый файл не сможет найти нативную DLL , Это то, что мне действительно не нравится, люди склонны забывать.
- Я могу добавить собственную DLL в проект, который ее использует, и в конфигурации свойств библиотеки DLL установить «Копировать, если новее». Таким образом, нативная DLL будет скопирована в выходную папку проекта и в каждый проект, который ссылается на проект. Таким образом, мне не нужно ничего запоминать. Собственная DLL будет скопирована в локальную папку каждого зависимого проекта.
Это кажется хорошим решением. Но команда msbuild, похоже, не в состоянии справиться с этой ситуацией. Например, предположим, что проект A напрямую использует нативную DLL, и я добавляю нативную DLL в проект A. Проект B ссылается на проект A, а проект C ссылается на проект B и проект A. Если для построения решения используется msbuild, нативная DLL будет 3 раза копировал в выходную папку проекта C, один для ссылки на проект A, один для ссылки на проект B, один для ссылки на проект B на проект A. В моем большом решении, к концу ссылки зависимости, Собственная DLL будет многократно копироваться в одну и ту же выходную папку, независимо от значения параметра «Копировать, если новее». На создание решения в целом уходит огромное количество времени.
Теперь я совершенно не представляю, как лучше всего решить мою ситуацию. Для тех, кто использует собственные библиотеки DLL, как вы развертываете DLL, чтобы: 1. это удобно как для развертывания на компьютере разработчика (компиляция и запуск), так и на компьютере пользователя (установка и запуск), 2. разработчики в большой команде не имеют помнить что-либо, когда он или она добавляет новый проект / установщик в решение; 3. достаточно умный способ сборки, позволяющий избежать ненужных лишних действий. Спасибо за любую подсказку, учебник в Интернете, предложение или умное обучение заранее.