HintPath для добавленной ссылки в Visual Studio

Я знаю, что могу добавить HintPath к внешним библиотекам DLL, чтобы помочь Visual Studio/TFS найти DLL при ее сборке.

Мне было интересно... можно ли добавить несколько HintPath?

Например... у разработчиков есть свои библиотеки DLL для одного места, и мы делаем GetLatest этих DLL в другом месте на сервере, поэтому необходимо несколько HintPath.

Как ты думаешь, мир?


person Maxime Rouiller    schedule 20.01.2009    source источник


Ответы (5)


К сожалению, вы не можете использовать несколько HintPath. Visual Studio/MSBuild принимает только последнее определение <HintPath> и игнорирует все предыдущие. Подтверждено в VS2010 и VS2012.

person Alex    schedule 16.11.2012
comment
Этот ответ должен быть принятым, поскольку другой дает ложную информацию. - person Krisztián Balla; 12.03.2013
comment
Вы можете использовать несколько HintPath с условием для каждого. Проверьте мой ответ ниже. - person Wolf5; 04.11.2014
comment
Подтверждено, что в VS2015 также используется только последний HintPath. - person Piotr Perak; 20.09.2016

Этот ответ больше недействителен. Как говорится в Sardaukar, Visual Studio всегда слепо использует последний HintPath. ответ Алекса поддерживает это.


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

Таким образом, несколько HintPath возможны.

Когда у вас есть это:

<Reference Include="System.ComponentModel.Composition.Codeplex">
    <HintPath>..\..\..\MEF2_Preview2\bin\System.ComponentModel.Composition.Codeplex.dll</HintPath>
</Reference>

Вы можете просто добавить больше пути подсказки:

<Reference Include="System.ComponentModel.Composition.Codeplex">
    <HintPath>..\..\..\MEF2_Preview2\bin\System.ComponentModel.Composition.Codeplex.dll</HintPath>
    <HintPath>D:\MEF\System.ComponentModel.Composition.Codeplex.dll</HintPath>
</Reference>
person Maxime Rouiller    schedule 20.01.2009
comment
Вы только что добавили несколько записей HintPath или у вас есть несколько путей в одной записи? - person Soo Wei Tan; 01.10.2009
comment
если одна запись, была ли она разделена запятой или точкой с запятой? - person Maslow; 11.06.2010
comment
Не могли бы вы рассказать нам, как это возможно? - person Nick; 16.07.2010
comment
Для этого я закрываю решение, открываю файл проекта в Блокноте (оканчивается на .csproj), после чего вы увидите приведенный выше код. - person Iain; 01.12.2010
comment
(Нашел этот вопрос при решении проблемы с путями подсказок, и я должен исправить приведенный выше ответ). Ваш ответ ошибочен. Да, вы можете вручную добавить несколько путей подсказок в файл csproj, но Visual Studio будет использовать только последний элемент пути подсказок. Вероятно, это работает в вашей ситуации, потому что ваш второй путь подсказки может быть разрешен. Попробуйте поменять местами пути подсказок, чтобы d:\MEF\System.ComponentModel.Composition.CodePlex.dll был первым. Затем скомпилируйте. Вы, вероятно, увидите, что Visual Studio теперь попытается сослаться на последний путь подсказки. - person Sardaukar; 10.05.2011
comment
@ jon-eric Я ценю то, что вы пытаетесь сделать, но все, что нужно, — простое заявление об отказе от ответственности с удобными ссылками. Явный призыв к отрицательным или положительным голосам в подобном большом заявлении об отказе от ответственности — опасный путь. - person Adam Lear; 05.04.2013
comment
В этом решении даже вы объявляете несколько путей, которые будут использоваться последними. > имеет больше смысла, поскольку используемый путь соответствует некоторому условию. - person Israel Garcia; 21.12.2019

Для этого вы можете использовать переменные окружения. Например.

<Reference Include="System.ComponentModel.Composition.Codeplex">
    <HintPath>$(PathToDLLs)\MEF2_Preview2\bin\System.ComponentModel.Composition.Codeplex.dll</HintPath>
</Reference>
person Michael Hablich    schedule 08.08.2011

Используя Условие, вы можете:

<Reference Include="TheAssembly">
    <HintPath Condition="Exists('..\My\Assembly\Path')">..\My\Assembly\Path\TheAssembly.dll</HintPath>
    <HintPath Condition="Exists('..\..\My\Assembly\Path')">..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
    <HintPath Condition="Exists('..\..\..\My\Assembly\Path')">..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
    <HintPath Condition="Exists('..\..\..\..\My\Assembly\Path')">..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
    <HintPath Condition="Exists('..\..\..\..\..\My\Assembly\Path')">..\..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
    <HintPath Condition="Exists('..\..\..\..\..\..\My\Assembly\Path')">..\..\..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
    <HintPath Condition="Exists('..\..\..\..\..\..\..\My\Assembly\Path')">..\..\..\..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
    etc...
</Reference>

Будет использоваться последний HintPath, где условие оценивается как истинное.

person Wolf5    schedule 04.11.2014
comment
Работает ли это с приведенным выше наблюдением о последнем выбранном пути подсказки? Игнорирует ли он пути подсказок с ложными условиями и берет последний с истинным значением? - person Denise Skidmore; 02.03.2018
comment
Он игнорирует все, кроме последнего, где условие истинно. - person Wolf5; 05.03.2018

Добавьте следующее в конец файла проекта сразу после раздела целей с комментариями:

<Target Name="BeforeResolveReferences">
  <CreateProperty Value="YOUR_FIRST_PATH;YOUR_SECOND_PATH;$(AssemblySearchPaths)">
    <Output TaskParameter="Value" PropertyName="AssemblySearchPaths" />
  </CreateProperty>
</Target>

Замените YOUR_FIRST_PATH и YOUR_SECOND_PATH вашими путями.

Важно, чтобы это было после следующей строки, иначе ваши настройки будут перезаписаны:

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

С записью $(AssemblySearchPaths) в конце строки библиотеки DLL в ваших путях переопределяют обычное разрешение. Если вы переместите его в начало, то сначала будет пробоваться обычное разрешение, а дополнительные пути проверяются на наличие ненайденных. Обычное разрешение включает <HintPath> разделов, поэтому нет необходимости их удалять, если ваши пути идут первыми.

person Vladimir Shutow    schedule 04.04.2013