Создайте проект Visual Studio без доступа к ссылочным библиотекам - PullRequest
7 голосов
/ 16 марта 2010

У меня есть проект, который имеет набор бинарных зависимостей (сборочные библиотеки, для которых у меня нет исходного кода). Во время выполнения эти зависимости необходимо предварительно установить на машине, а во время компиляции они требуются в дереве исходных кодов, например, g в папке lib. Поскольку я также делаю исходный код доступным для этой программы, я хотел бы разрешить ее простую загрузку и сборку. К сожалению, я не могу перераспределить dll, и это усложняет ситуацию, поскольку VS не будет связывать проект без доступа к ссылочным dll.

Есть ли способ включить и связать этот проект в отсутствие реальных ссылочных библиотек?

Может быть, есть способ заставить VS связываться с автоматически сгенерированной заглушкой dll, чтобы она могла перестраиваться без оригинала? Может быть, есть сторонний инструмент, который сделает это? Какие-либо подсказки или лучшие практики вообще в этой области?

Я понимаю, что человек должен иметь доступ к dll для запуска кода, поэтому имеет смысл добавить их в процесс сборки, но я просто пытаюсь избавить их от необходимости собирать все dll и размещать их в папке lib вручную.

Ответы [ 5 ]

2 голосов
/ 16 марта 2010

Ко всем добрым советам выше, согласился. При этом, может быть, существует допустимый сценарий, когда внешние DLL обычно не нужны? Итак, вот что вы делаете. Вы оборачиваете и изолируете их. (Это более высокий уровень абстракции, чем создание интерфейсов, поэтому его немного проще поддерживать).

В Visual Studio, если вы не перекомпилируете конкретные проекты VS, которые ссылаются на внешние DLL, вы можете скомпилировать остальные проекты VS Solution, не имея под рукой этих DLL. Таким образом, если вы каким-то образом обернете внешние DLL своими собственными DLL, а затем распространите эти обертки только в двоичном виде, человеку, разделяющему ваш исходный код, не понадобятся внешние DLL для компиляции основного решения.

Вопросы : 1. Дополнительная работа по разделению кода оболочки на изолированные проекты. 2. Другие проекты VS должны добавить ссылки на библиотеки DLL-оболочки как ссылки «Файловая система» на папку «LIB», а не «Ссылки проекта». 3. Конфигурации VS Solution должны отключить компиляцию для библиотек DLL оболочки. Новая конфигурация должна быть добавлена, чтобы явно перекомпилировать их, если это необходимо. 4. Определение VS Project для каждой библиотеки Wrapper DLL должно включать событие после сборки, чтобы скопировать их в ожидаемое местоположение папки «LIB». 5. Во время выполнения внешние DLL-файлы должны присутствовать в каталоге bin приложения, или в GAC компьютера, либо загружаться явным образом. ПРИМЕЧАНИЕ. Если они отсутствуют, то только в случае их фактического вызова во время выполнения их отсутствие приведет к ошибке времени выполнения. то есть вам не нужно иметь их, если в общем случае код не вызывает их. 6. Во время выполнения вы можете обнаружить ошибки при загрузке внешних DLL-файлов и представить пользователю красивое сообщение об ошибке, в котором будет сказано: «Чтобы воспользоваться этой функцией, установите следующий продукт: xyz». Что лучше, чем отображение «AssemblyLoadException ... пожалуйста, используйте FusionLogViewer ... и т. Д.» 7. При запуске приложения вы можете проверить и обнаружить отсутствующие библиотеки DLL, а затем отключить определенные функции, которые зависят от них.

Например: в соответствии с этим шаблоном у меня может быть приложение, которое интегрируется с Microsoft CRM и SAP, но только для определенной функции, т.е. импорта / экспорта.
Во время разработки, если разработчику никогда не понадобится менять оболочку, он сможет перекомпилировать без этих внешних DLL. Во время выполнения, если пользователь никогда не вызывает эту функцию, приложение никогда не вызовет оболочку, и поэтому внешние DLL не нужны.

2 голосов
/ 16 марта 2010

Возможно, одна из этих идей поможет вам решить проблему:

  • Извлечение интерфейсов из всех классов в сторонних dll. Поместите эти интерфейсы в собственный проект (то же решение) и добавьте ссылку на эту сборку интерфейса. Также добавьте EventHandler в AppDomain.AssemblyResolve и попытайтесь найти и загрузить сборки во время выполнения. (Кредиты идут в НГ)
    • В зависимости от того, насколько велики dll и как часто вносятся изменения в публичную часть, это может стать настоящей болью.
  • Предоставьте readme.txt, где вы объясните, как получить необходимые сборки и куда пользователь должен поместить их относительно пути проекта. Обычно VS достаточно умен, чтобы убрать восклицательный знак сразу после того, как вы поместите сборку в нужное место, откуда проект ссылается на нее (возможно, вам придется нажать «Обновить» в Solution Explorer) (Авторы обращаются к Полу)
    • Не забудьте также добавить readme.txt в ваше решение , щелкнув правой кнопкой мыши ваше решение и выбрав «Добавить -> Существующий элемент». В этом случае он займет довольно заметное место в Visual Studio Solution Explorer, и пользователь сможет прочитать его двойным щелчком мыши.
  • Создайте еще один проект в своем решении, который сможет автоматически загружать все необходимые библиотеки и размещать их в нужном месте. Может быть, он должен проверить заранее, если эти необходимые файлы уже есть, прежде чем начать загрузку. Установите зависимости проекта от исходного проекта, чтобы он зависел от этого. Так что он всегда будет построен раньше вашего оригинала. Затем запустите этот вспомогательный инструмент загрузки в событии предварительной сборки вашего исходного проекта и не забудьте выйти из вашей программы со значением int. 0 означает успех, любую другую ошибку, и поэтому Visual Studio знает, был ли ваш инструмент успешным, и останавливает процесс компиляции перед зависанием отсутствующих библиотек DLL.
    • Может быть, практически невозможно автоматически загрузить файлы, потому что вам нужно войти на веб-страницу или использовать некоторые файлы cookie, flash, капчу и т. Д., Которые не могут быть автоматизированы инструментом.
0 голосов
/ 16 марта 2010

Довольно радикальной возможностью было бы использование отдельного шаблона интерфейса и программная загрузка библиотек во время выполнения.

0 голосов
/ 16 марта 2010

Я предпочел бы, чтобы во время компиляции зависела зависимость от времени компиляции, а не ошибка времени выполнения, которая могла бы занять некоторое время для отслеживания.

Поместите файл Readme.txt в свое решение и четко укажите, что это за зависимости, где их найти и что с ними делать.

0 голосов
/ 16 марта 2010

Хорошо избавьте их от необходимости собирать все сборки и помещайте их в папку lib самостоятельно. Затем зафиксируйте их вместе с исходным кодом в хранилище. Таким образом, люди, проверяющие код из хранилища, также получат все необходимое для компиляции проекта.

...