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

本文关键字:程序集 引用 csproj 文件夹 结构 | 更新日期: 2023-09-27 18:19:53

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

  • Libs
    • Dependency.dll
  • 项目
    • 我的项目
      • 我的项目.csproj

因此,MyProject.csproj中对Dependency.dll的引用有一个类似于以下内容的提示路径:

..'..'Libs'Dependency.dll

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

  • Libs
    • Dependency.dll
  • 我的项目
    • 我的项目.csproj

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

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

我发现了以下可能的解决方案,它们很棒,但需要修改csproj。在我的情况下,这是最有可能的,但有时有些外部组件我无法请求这样的修改,所以如果可能的话,我会寻找一些解决方案级别的覆盖。

  • 基于文件存在性检查的条件提示路径:.csproj程序集的多个提示路径在大多数情况下,解决方案结构在这里是众所周知的
  • 指定多个部件搜索位置:https://stackoverflow.com/a/15816779/220230

谢谢。

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

目前,我使用这篇博客文章中概述的技术解决了这个问题。

<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。如果所有dll都在Libs文件夹的根目录中,那么可以从Include值中删除第一个通配符。