首页 > 解决方案 > 加载包含作为通配符的项目的 .NET 项目

问题描述

我已经发现,在我的 C#/F# 代码中,我可以加载有关任何 .NET 项目的信息,使用

collection.LoadProject(path_to_my_proj_file)

哪里collection是类型ProjectCollection。然后,我可以访问项目中定义的所有属性和项及其所有依赖项。例如,我可以通过Compile以下方式访问包含的所有文件

project.GetItems "Compile"

假设我想在我的 fsproj 文件中定义一个自定义 ItemGroup:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 ...
  <ItemGroup>
    <MyGroup Include="Test.txt" />
    <MyGroup Include="TestFiles\**\*" />
  </ItemGroup>
</Project>

一些评论:

当我使用开头提到的方法加载项目并运行时

project.GetItems "MyGroup"

我只得到一项,即“Test.txt”。除非我在 fsproj 中明确定义它们(即没有通配符),否则不会发现其他文件。

有没有办法让我也发现使用通配符包含的文件?我什至很高兴让它们以未解决的形式出现。因此,获取“TestFiles\**\*”而不是匹配模式的特定文件也可以。

标签: c#.netf#msbuildmsbuild-api

解决方案


找到了解决方案。

首先,让我说问题在我这边。实际上,通常当您尝试加载项目时,它也会加载所有文件。即使是那些用通配符定义的,只要 ofc 匹配模式。

这是交易:在我的应用程序中,我不使用 plain collection.LoadProject,而是使用更复杂的库。是的 - 图书馆做了一些导致问题的神奇东西。

在这种情况下,问题很简单:所有 *.[cs|fs]proj 文件都被复制到C:\temp\<random_folder_name>. 只有 *.[cs|fs]proj 文件 - 仅此而已。结果,当项目加载器尝试评估解决方案时,根本没有要进行模式匹配的文件,从而导致零元素。

这里的教训是:编写一个合适的 MCVE 很重要——可以节省我(可能还有你)一些时间。对于问题,伙计们深表歉意!


推荐阅读