HintPath vs ReferencePath в Visual Studio
в чем именно разница между HintPath в a .файл csproj и ReferencePath на ? Мы пытаемся выполнить соглашение, в котором библиотеки DLL зависимостей находятся в репо svn "releases", и все проекты указывают на конкретный выпуск. Поскольку разные разработчики имеют разные структуры папок, относительные ссылки не будут работать, поэтому мы придумали схему использования переменной среды, указывающей на папку releases конкретного разработчика, чтобы создать абсолютную ссылку. Так что после добавления ссылки, мы вручную отредактировать файл проекта, чтобы изменить ссылку на абсолютный путь с помощью переменной среды.
Я заметил, что это можно сделать как с HintPath и ReferencePath, но единственное различие, которое я мог найти между ними, это HintPath разрешена во время сборки и ReferencePath при загрузке проекта в IDE. Однако я не совсем уверен, каковы последствия этого. Я заметил, что VS иногда переписывает .csproj.user и я хочу переписать ReferencePath, но я не уверен, что вызывает это.
Я слышал, что лучше не проверять в .csproj.user файл, так как он зависит от пользователя, поэтому я хотел бы стремиться к этому, но я также слышал, что HintPath-указанная DLL не "гарантированно" загружается, если та же DLL, например, находится в выходном каталоге проекта. Какие мысли по этому поводу?
4 ответов:
согласно этому блогу MSDN: https://blogs.msdn.microsoft.com/manishagarwal/2005/09/28/resolving-file-references-in-team-build-part-2/
существует порядок поиска сборок при построении. Порядок поиска выглядит следующим образом:
- файлы из текущего проекта-обозначены ${CandidateAssemblyFiles}.
- $(ReferencePath) свойство, которое происходит от .файл пользователя / цели.
- %(HintPath) метаданные, указанные справочный элемент.
- каталог целевой платформы.
- каталоги, найденные в реестре, который использует AssemblyFoldersEx регистрации.
- зарегистрированные папки сборки, обозначенные ${AssemblyFolders}.
- $(OutputPath) или $(OutDir)
- GAC
Итак, если искомая сборка найдена HintPath, но альтернативную сборку можно найти с помощью ReferencePath, он предпочтет ReferencePath'D К HintPathd один.
посмотрите в файле Microsoft.Общий.цели
ответ на вопрос находится в файле
Microsoft.Common.targetsдля версии целевой платформы.для .Net Framework версии 4.0 (и 4.5 !) AssemblySearchPaths-элемент определяется следующим образом:
<!-- The SearchPaths property is set to find assemblies in the following order: (1) Files from current project - indicated by {CandidateAssemblyFiles} (2) $(ReferencePath) - the reference path property, which comes from the .USER file. (3) The hintpath from the referenced item itself, indicated by {HintPathFromItem}. (4) The directory of MSBuild's "target" runtime from GetFrameworkPath. The "target" runtime folder is the folder of the runtime that MSBuild is a part of. (5) Registered assembly folders, indicated by {Registry:*,*,*} (6) Legacy registered assembly folders, indicated by {AssemblyFolders} (7) Resolve to the GAC. (8) Treat the reference's Include as if it were a real file name. (9) Look in the application's output folder (like bin\debug) --> <AssemblySearchPaths Condition=" '$(AssemblySearchPaths)' == ''"> {CandidateAssemblyFiles}; $(ReferencePath); {HintPathFromItem}; {TargetFrameworkDirectory}; {Registry:$(FrameworkRegistryBase),$(TargetFrameworkVersion),$(AssemblyFoldersSuffix)$(AssemblyFoldersExConditions)}; {AssemblyFolders}; {GAC}; {RawFileName}; $(OutDir) </AssemblySearchPaths>для .Net Framework 3.5 определение то же самое, но комментарий неверен. Определение 2.0 немного отличается, оно использует $(OutputPath) вместо $(OutDir).
на мой машина у меня есть следующие версии файла Microsoft.Общий.цели:
C:\Windows\Microsoft.NET\Framework\v2.0.50727\Microsoft.Common.targets C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Microsoft.Common.targets C:\Windows\Microsoft.NET\Framework64\v3.5\Microsoft.Common.targets C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targetsэто с Visual Studio 2008, 2010 и 2013 установлен на Windows 7.
тот факт, что выходной каталог ищется, может быть немного разочаровывающим (как указывает оригинальный плакат), потому что он может скрыть неверный HintPath. Решение строит OK на вашем локальном компьютере, но ломается, когда вы строите в чистой структуре папок (например, на машине сборки).
мой собственный опыт показывает, что лучше придерживаться одного из двух видов сборок:
- "локальная" сборка в текущем каталоге сборки
- сборка в GAC
Я нашел (так же, как вы описали) другие методы, которые либо слишком легко ломаются, либо имеют раздражающие требования к обслуживанию.
любая сборка, которую я не хочу GAC, должна жить в каталоге выполнения. Любая сборка, которая не или не может быть в каталоге выполнения I GAC (управляется автоматическими событиями сборки).
Это не дало мне никаких проблем до сих пор. Хотя я уверен, что есть ситуация, когда это не сработает, обычный ответ на любую проблему был "о, просто GAC it!". 8 D
надеюсь, что это поможет!
хотя это старый документ, но он помог мне решить проблему "HintPath" игнорируется на другой машине. Это было потому, что ссылка DLL должна быть в системе управления версиями, а также:
выдержка:
To include and then reference an outer-system assembly 1. In Solution Explorer, right-click the project that needs to reference the assembly,,and then click Add Existing Item. 2. Browse to the assembly, and then click OK. The assembly is then copied into the project folder and automatically added to VSS (assuming the project is already under source control). 3. Use the Browse button in the Add Reference dialog box to set a file reference to assembly in the project folder.
Comments