将语法检查(Intellisens、Resharper 等)添加到 .cs 文件而不编译它们

Add syntactic checking (Intellisens, Resharper, etc) to .cs file without compiling them

我有一堆 .cs 文件,代表使用 Roslyn API 进行某些操作的测试用例。由于它们应该具有有效的编译时语法,我希望在写入这些文件时对这些文件进行 Intellisense、Resharper 和其他预编译时间检查,但在构建解决方案时不实际编译它们(自测试以来只会查看语法)。

现在,我可能只为这些输入测试文件创建另一个项目(并确保它永远不会编译),但我宁愿将它们保留在测试项目中(我认为它们属于这个项目,为了简单起见)。我真的不在乎这些文件是否最终没有真正包含在解决方案中,只要我能在最后进行语法检查(尽管这似乎不太可能)。

起初,我以为我可以简单地排除目录在 .csproj 中的编译,但我发现没有这样的 属性 允许这样做。我听说 <CompileDependsOn> 可能会在这里帮助我,但我不明白具体如何。

我的直接问题是:是否可以对在构建 project/solution 时最终不会被编译的文件进行语法检查(Intellisense、Resharper 等),而无需将它们放在单独的、非建筑项目 ?

它与这个 类似,只是不是将构建操作更改为 "Embedded resource",而是将其更改为 "None"。不是 100% 确定这一点,因为当我尝试它时 - 它确实从编译中排除了文件,但所有文本都改变了颜色,但智能感知似乎仍然存在。所有 resharper 选项似乎仍然存在。

我至少可以想到几个可能的解决方案。

一个解决方案可能是使用预处理器定义。如果指令干扰您的测试,此解决方案可能无法令人满意,但如果您想尝试一下,您的 .cs 文件可能如下所示:

#if TESTFILE
namespace ClassesNotToCompile
{
    public class IndividualClassNotToCompile
    {
        ...
    }
}
#endif

然后您需要在项目的构建配置中定义符号 TESTFILE。然后,不要使用该构建配置。不过,您可能必须 select IDE 中的配置才能获得语法高亮显示。

另一种方法是编辑 .csproj 文件,正如您所建议的那样。假设 .NET 3.5 或更高版本,有一个名为 Remove 的项目属性,可以在 ItemGroup 位于 Target 内时使用。您可以在 BeforeBuild 目标中使用此属性从 Compile 项目中删除文件:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  ...
  <ItemGroup>
    <Compile Include="CompileMe.cs" />
    <Compile Include="NonCompiling\DoNotCompileMe.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  ...
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Target Name="BeforeBuild">
    <ItemGroup>
      <Compile Remove="NonCompiling\*" />
      <Content Include="NonCompiling\*">
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </Content>
    </ItemGroup>
  </Target>
  ...
</Project>

您的 BeforeBuild 目标定义出现在 Microsoft.CSharp.targetsImport 之后很重要。否则,您的自定义 BeforeBuild 目标将不会覆盖导入的默认空 BeforeBuild 目标。