HintPath для добавленной ссылки в Visual Studio - PullRequest
33 голосов
/ 20 января 2009

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

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

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

Что вы думаете, мир?

Ответы [ 5 ]

38 голосов
/ 16 ноября 2012

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

14 голосов
/ 20 января 2009

Этот ответ больше не действителен. Как говорит Сардаукар , 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>
8 голосов
/ 08 августа 2011

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

<Reference Include="System.ComponentModel.Composition.Codeplex">
    <HintPath>$(PathToDLLs)\MEF2_Preview2\bin\System.ComponentModel.Composition.Codeplex.dll</HintPath>
</Reference>
3 голосов
/ 04 ноября 2014

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

<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, где Условие имеет значение true.

2 голосов
/ 04 апреля 2013

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

<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> разделов, поэтому нет необходимости удалять их, если ваши пути идут первыми.

...