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

时间:2015-03-26 17:57:45

标签: c# visual-studio intellisense projects-and-solutions csproj

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

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

起初,我以为我可以简单地在.csproj中排除编译目录,但我发现没有这样的属性允许这样做。我听说<CompileDependsOn>可能会对我有所帮助,但我并不清楚如何理解。

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

2 个答案:

答案 0 :(得分:1)

除了将构建操作更改为“Embedded resource”而不是将构建操作更改为“None”之外,它与https://stackoverflow.com/questions/29242600/compile-your-application-with-outer-documents类似。从我尝试它以来它不是100%肯定 - 它确实从编译中排除了文件,但是所有文本都改变了颜色,但智能感知似乎在那里。所有的resharper选项似乎仍然存在。

答案 1 :(得分:1)

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

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

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

然后,您需要在项目的构建配置中定义符号TESTFILE。然后,不要使用该构建配置。但是,您可能必须在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目标定义必须在Import Microsoft.CSharp.targets之后显示。否则,您的自定义BeforeBuild目标不会覆盖导入的默认空BeforeBuild目标。