2014-08-29 5 views
0

у меня есть C# проект MyProject.csproj, который находится в растворе со следующей структурой папок и ссылок Dependency.dll:Используя те же ссылки на сборки в csproj с различными структурами папок

  • Libs
    • Dependency.dll
  • Проекты
    • MyProject
      • MyProject.csproj

Таким образом, ссылка на Dependency.dll в MyProject.csproj имеет HintPath что-то вроде этого:

..\..\Libs\Dependency.dll 

Теперь я как использовать MyProject в другом решении в другой структуре проекта, без изменений, в качестве источника. Это связано с тем, что MyProject находится в собственном репозитории управления версиями, и я использую его в разных решениях как субрепозитории Mercurial/подмодули Git. (Проблема может быть решена на уровне управления источником ...) Такое diffreent решение будет выглядеть следующим образом:

  • Libs
    • Dependency.dll
  • MyProject
    • MyProject.csproj

Обратите внимание: папка MyProject теперь находится на том же уровне, что и папка Libs. Таким образом, исходный HintPath теперь недействителен (поскольку он должен быть ..\Libs\Dependency.dll), и я получаю ошибки сборки.

Есть ли способ исправить это, но сохранить тот же csproj через различные решения?

Я нашел следующие возможные решения, которые являются большими, но требуют модификации csproj. Это в основном возможно в моем случае, но иногда есть внешние компоненты, где я не могу запрашивать такие модификации, поэтому я хотел бы, если это возможно, переопределить уровень решения.

Спасибо.

ответ

2

На данный момент я решил проблему, используя технику, изложенную в this blogpost.

<ItemGroup> 
    <LibReferenceSearchPathFiles Include="..\..\Libs\**\*.dll"> 
     <InProject>false</InProject> 
    </LibReferenceSearchPathFiles> 
</ItemGroup> 
<Target Name="BeforeResolveReferences"> 
    <RemoveDuplicates Inputs="@(LibReferenceSearchPathFiles->'%(RootDir)%(Directory)')"> 
    <Output TaskParameter="Filtered" ItemName="LibReferenceSearchPath" /> 
    </RemoveDuplicates> 
    <CreateProperty Value="@(LibReferenceSearchPath);$(AssemblySearchPaths)"> 
    <Output TaskParameter="Value" PropertyName="AssemblySearchPaths" /> 
    </CreateProperty> 
</Target> 

Это позволяет загружать библиотеки DLL из подпапок Libs. Если все DLL-файлы будут в корне папки Libs, тогда первый шаблон можно удалить из значения Include.