使用中的csproj同一组件的引用具有不同的文件夹结构
问题描述:
我有一个C#项目,MyProject.csproj,在与下面的文件夹结构和参考Dependency.dll溶液坐在:使用中的csproj同一组件的引用具有不同的文件夹结构
- 利布斯
- Dependency.dll
- 项目
- MyProject的
- MyProject.csproj
- MyProject的
因此,在MyProject.csproj引用Dependency.dll有这样的一个HintPath:
..\..\Libs\Dependency.dll
现在我喜欢在不同项目结构的不同解决方案中使用MyProject,而不作修改。这是因为MyProject位于它自己的源代码控制库中,并且我将它作为Mercurial subrepositories/Git子模块在不同的解决方案中使用。 (这个问题可能在源代码控制中得到解决......)这样的diffreent的解决方案是这样的:
- 利布斯
- Dependency.dll
- MyProject的
- MyProject.csproj
请注意,MyProject文件夹现在与Libs文件夹位于同一级别。因此,原来的HintPath现在是无效的(因为它应该是..\Libs\Dependency.dll
),我得到构建错误。
有没有办法解决这个问题,但保持不同的解决方案相同的csproj?
我发现了以下可能的解决方案,但它们都很棒,但需要修改csproj。这在我的情况下是可能的,但有时候会有外部组件,我无法请求这些修改,所以如果可能的话,我会寻找一些解决方案级别的重写。根据文件存在检查
- 条件HintPath:.csproj multiple hint paths for an assembly这可能工作作为大多数情况下的解决方案的结构是这里著名的。
- 指定多个组件的搜索位置:https://stackoverflow.com/a/15816779/220230
谢谢。
答
现在我使用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>
这使得可以加载Lib的子文件夹中的dll。如果所有dll都位于Libs文件夹的根目录下,则可以从Include值中删除第一个通配符。