在csproj中使用具有不同文件夹结构的相同程序集引用

时间:2014-08-29 08:41:39

标签: c# git mercurial csproj assembly-loading

我有一个C#项目,MyProject.csproj位于具有以下文件夹结构的解决方案中并引用了Dependency.dll:

  • 利布斯
    • Dependency.dll
  • 项目
    • MyProject的
      • MyProject.csproj

因此,MyProject.csproj中对Dependency.dll的引用有一个类似这样的HintPath:

..\..\Libs\Dependency.dll

现在我想在不同的项目结构中使用MyProject,而不需要修改,作为源代码。这是因为MyProject位于自己的源代码控制库中,并且我在不同的解决方案中使用它作为Mercurial子库/ Git子模块。 (问题可能在源代码管理级别上得到解决......)这样一个不同的解决方案看起来像这样:

  • 利布斯
    • Dependency.dll
  • MyProject的
    • MyProject.csproj

请注意,MyProject文件夹现在与Libs文件夹位于同一级别。因此原始的HintPath现在无效(因为它应该是..\Libs\Dependency.dll)并且我得到构建错误。

有没有办法解决这个问题但是在不同的解决方案中保持相同的csproj?

我找到了以下可能的解决方案,这些解决方案很棒但需要修改csproj。这种情况在我的情况下几乎是可能的,但有时我会不能请求这些修改的外部组件,所以如果可能的话,我会寻找一些解决方案级别的覆盖。

谢谢。

1 个答案:

答案 0 :(得分: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>

这样可以加载来自Libs子文件夹的dll。如果所有dll都位于Libs文件夹的根目录中,则可以从Include值中删除第一个通配符。