0

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

    • 依赖.dll
  • 项目
    • 我的项目
      • 我的项目.csproj

因此,在 MyProject.csproj 中对 Dependency.dll 的引用具有如下所示的 HintPath:

..\..\Libs\Dependency.dll

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

    • 依赖.dll
  • 我的项目
    • 我的项目.csproj

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

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

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

谢谢你。

4

1 回答 1

2

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

<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 值中删除第一个通配符。

于 2014-08-30T22:07:17.193 回答