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