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、 如果您不明白我的意思,请尝试在切换到内容后关闭并重新打开文件。