HintPath для добавленной ссылки в Visual Studio
Я знаю, что могу добавить HintPath к внешним DLL, чтобы помочь Visual Studio/TFS найти dll при сборке.
Что мне было интересно, это... можно ли добавить несколько HintPath?
Например... разработчики имеют свои библиотеки DLL для одного места, и мы выполняем GetLatest из этих библиотек DLL в другом месте на сервере, поэтому нам требуется несколько HintPath.
Как вы думаете, мир?
5 ответов
Этот ответ больше не действителен. Как говорится в комментарии Сардаукара, Visual Studio всегда слепо использует последний HintPath. Ответ Алекса подтверждает это.
Хорошо. Я быстрее, чем Stackru на этот раз. Я попытался добавить его, и, кажется, работает нормально.
Так что возможен множественный 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>
Извините, вы не можете использовать несколько HintPath. Visual Studio/MSBuild занимает только последнее <HintPath>
определение и будет игнорировать любые предыдущие. Подтверждено в VS2010 и VS2012.
Используя Условие, вы можете:
<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.
Вы можете использовать переменные среды для этого. Например
<Reference Include="System.ComponentModel.Composition.Codeplex">
<HintPath>$(PathToDLLs)\MEF2_Preview2\bin\System.ComponentModel.Composition.Codeplex.dll</HintPath>
</Reference>
Добавьте следующее в конец файла вашего проекта сразу после закомментированного раздела целей:
<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>
разделы, поэтому нет необходимости удалять их, если ваши пути идут первыми.