Visual Studio 2010 - как заставить ссылку на проект использовать точный путь NOT GAC или Program Files?

У нас всегда есть эта проблема, у нас есть ряд решений и смежная папка /Components/. Все библиотеки DLL, которые мы хотим найти, находятся в этой папке. Некоторые из них мы построили из источника, чтобы использовать определенный номер версии, который существует только в бинарнике Components, но когда пользователь на другой машине получает последнее из всего, что есть в TFS, и поэтому имеет точный размер на дисковой структуре. Visual Studio STILL изменяет ссылки на те, которые установлены в Program Files, GAC или в другом месте.

Попробовали вручную отредактировать файл proj, чтобы включить HintPath, например.

<Reference Include="Foo, Version=5.5.5.5, Culture=neutral, processorArchitecture=MSIL">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\Components\Foo.dll</HintPath>
</Reference>

безрезультатно. Как мы визуализируем студию FORCE, чтобы уважать этот путь?

Ответ 1

Установка "SpecificVersion" в true, в дополнение к указанию "hintPath", похоже на решение, поскольку оно "препятствует визуальной студии использовать несколько целевых правил для разрешения сборки".

Однако, как только foo.dll недоступен (при создании или загрузке проекта), Visual Studio запускает магию и изменяет целевой путь сборки к ближайшей сборке.

После этого не имеет значения, восстанавливается ли исходный файл foo.dll в его местоположении (по указанному пути) или даже CHANGED! - Visual Studio по-прежнему ссылается на свой недавно найденный матч. Это очень нежелательно.

Возможные решения:

  • Сильное имя foo.dll, но тогда foo.dll может ссылаться только на другие сильные именованные сборки (часто нежелательные).

  • Настроить разрешение сборки, зарегистрировавшись для события в родительском приложении. Это позволяет точно определить, где найти целевую сборку во время выполнения, но это кажется слишком большим для решения этой простой проблемы.

Мой работающий над этой проблемой (легко) заключался в том, чтобы установить LOCAL COPY в FALSE и добавить в проект пост-сборку, которая вручную копирует целевую сборку в папку целевого bin. Плохая часть этого - это количество дублирования (и развязки), созданное между этапом после сборки и конфигурацией ссылок проекта.

Пожалуйста, Microsoft - добавьте опцию на страницу свойств Reference, которая будет определять приоритет hintPath (который мы явно укажем) по волшебному пути неожиданности... или, по крайней мере, бросить предупреждение /error, если они отличаются друг от друга!

Ответ 2

У нас есть одна и та же настройка - мы ссылаемся на сторонние сборки (и некоторые из наших собственных) в отдельной папке, а подсказки в файле .csproj работают очень хорошо для нас.

Visual Studio сначала попытается найти dll в HintPath, и только если он ее не найдет, тогда он будет выглядеть дальше - двоичные файлы рядом с исполняющей сборкой, папкой с решением или GAC. Кроме того, помните, что вкладка Reference Paths в свойствах проекта обрабатывается так же, как HintPath, и что перечисленный порядок подсказок в папках имеет значение.

Если это по-прежнему беспокоит вас, возможно, вам стоит подумать о создании собственного локального сервера NuGet (что, предположительно, не так уж сложно), из которого сборки будут автоматически собираться при загрузке решения. Это немного перебор, но он также обрабатывает проблемы с несколькими версиями dll, которые используются в разных решениях. Мы все еще не сделали этого, поэтому я не могу рекомендовать его из первых рук, но это в нашем списке дел.

Ответ 3

Иногда hintpath может быть немного сложнее. Visual Studio не так умна, как нам нужно, и иногда мы можем редактировать файл csproj в XML. Способ сделать это заключается в следующем:

1.) Щелкните правой кнопкой мыши проект в проводнике решений и выберите "Выгрузить проект". // Это сделает проект неактивным в проводнике решений.

2.) Щелкните правой кнопкой мыши проект, пока он неактивен, и выберите "Edit YourProject.ext", где ext является либо vbproj, либо csproj. Это откроет редактор XML в Visual Studio. // Если вам нужно искать в файле, вы можете нажать Ctrl-F, но помните, что вам нужно будет настроить "Смотри в:" как "Текущий документ", иначе его не будет искать.

3.) Когда просмотр/редактирование завершено и изменения сохранены, вы закрываете файл XML, снова щелкните проект правой кнопкой мыши и выберите "Обновить проект".

Я перефразировал эти шаги, которые я нашел здесь: http://wiki.visualwebgui.com/pages/index.php/Visual_Studio_HintPath#Viewing_or_editing_the_project_file

Надеюсь, это поможет, это помогло мне.