C# 在.cs文件中添加语法检查(Intellisens、Resharper等),而不编译它们

C# 在.cs文件中添加语法检查(Intellisens、Resharper等),而不编译它们,c#,visual-studio,intellisense,projects-and-solutions,csproj,C#,Visual Studio,Intellisense,Projects And Solutions,Csproj,我有一堆.cs文件,它们表示使用Roslyn API进行某些操作的测试用例。因为它们应该具有有效的编译时语法,所以我希望在编写这些文件时对这些文件进行Intellisense、Resharper和其他编译前检查,但在构建解决方案时不实际编译它们(因为测试将只查看语法) 现在,我可能只为这些输入测试文件创建另一个项目(并确保它永远不会编译),但我更愿意将它们保留在测试项目中(为了简单起见,我认为它们属于哪里)。我真的不在乎这些文件最终是否真的包含在解决方案中,只要我最终能够进行语法检查(尽管这似乎

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

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

起初,我以为我可以简单地将目录排除在
.csproj
中进行编译,但我发现没有这样的属性允许这样做。我听说
可能会在这方面对我有所帮助,但我不知道具体是如何做到的


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

这与此类似,只是不将构建操作更改为“Embedded resource”,将其更改为“None”。从我尝试它时起,对这一点没有100%的把握-它确实从编译中排除了该文件,但所有文本都改变了颜色,但intellisense似乎仍在那里。所有的resharper选项似乎也在那里。

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

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

#if TESTFILE
namespace ClassesNotToCompile
{
    public class IndividualClassNotToCompile
    {
        ...
    }
}
#endif
然后,您需要在项目的生成配置中定义符号
TESTFILE
。然后,不要使用该生成配置。不过,您可能必须在IDE中选择该配置才能获得语法突出显示

另一种方法是按照您的建议编辑
.csproj
文件。假设.NET 3.5或更高版本,当
项目组
位于
目标
内时,可以使用名为
删除
的项属性。您可以在
预编译前
目标中使用此属性从
编译中删除文件e
项目:

<?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.targets
Import
之后,这一点很重要。否则,您的自定义
BeforeBuild
目标将不会覆盖导入时默认的空
BeforeBuild
目标。

第二个解决方案非常有效,谢谢!仅限我y必须稍微修改它,并包含一条将测试文件复制到输出目录的
指令,因为使用您的解决方案删除它们会在编译时不再移动它们,即使设置为
CopyAlways
@PhilGref,我忘了您希望在生成中输出。这也很容易做到,而无需一个
元素。我将更新我的答案。我尝试将.cs文件属性中的“Build Action”从“Compile”更改为其他内容,但我仍然得到语法着色、重新着色操作等。是的,您仍然得到基于简单语法解释的着色(类名为青色,运算符为蓝色等),但您无法在编译文件中获得预期的实际类型检查或intellisense自动完成。例如,在语句末尾省略分号或忘记正确关闭带括号的if语句将显示为错误,但在类上下文中使用不存在或不可访问的方法不会导致错误t、 如果您不明白我的意思,请尝试在切换到内容后关闭并重新打开文件。