如何使C#源文件由Visual Studio处理,但不在程序集中编译?

如何使C#源文件由Visual Studio处理,但不在程序集中编译?,c#,visual-studio-2010,visual-studio,build,msbuild,C#,Visual Studio 2010,Visual Studio,Build,Msbuild,我在项目树中有许多C#脚本源文件,标记为buildaction:None 问题是:如果源文件标记为生成操作:无,则转到声明,转到实现,Visual Studio和Resharper的其他导航和重构功能不再工作 一旦应用程序运行,脚本文件最终由CSharpCodeProvider编译,其行为通常与实际代码库(原始可执行程序集)中的脚本文件完全相同 这里的区别在于源文件不是由MSBuild编译的,而是由应用程序本身编译的 我如何强制Visual Studio/build process分析文件(就好

我在项目树中有许多C#脚本源文件,标记为
buildaction:None

问题是:如果源文件标记为
生成操作:无
,则
转到声明
转到实现
,Visual Studio和Resharper的其他导航和重构功能不再工作

一旦应用程序运行,脚本文件最终由
CSharpCodeProvider
编译,其行为通常与实际代码库(原始可执行程序集)中的脚本文件完全相同

这里的区别在于源文件不是由MSBuild编译的,而是由应用程序本身编译的


我如何强制Visual Studio/build process分析文件(就好像它们将被编译一样),而不将它们包含到最终的可执行程序集中?

一个可能的选择是使用不同的生成配置,对相关文件进行不同的设置

您可以有一个开发配置,其中文件设置为“编译”,以及一个部署配置,其中文件设置为“无”


这样,您在处理代码时将获得良好的智能感知,并且在构建之前切换到“部署”配置时不会发生编译。

如果您编辑主项目文件(
.csproj
)并在构建后添加一个
目标,您可以在构建后调用任何自定义操作。以下示例为扩展名为
.proj
的项目中的所有
Build Action=None
项调用compile.exe

<Target Name="AfterBuild">

  <ItemGroup>
    <Scripts Include="@(None)" Condition="'%(Extension)' == '.proj'" />
  </ItemGroup>
  <Message Text="Scripts files: @(Scripts)" Importance="high" />
  <Exec Command="Compile.exe %22%(Scripts.FullPath)%22" 
        WorkingDirectory="$(MSBuildProjectDirectory)"
        Condition="'@(Scripts)' != ''"  />
</Target>


应用程序运行时,您无法更改生成配置。另外,只有当存在用于切换构建配置的热键时,这才是一个好主意。这些脚本的关键思想是快速迭代——当FileSystemWatcher触发事件时,它们会自动重建并合并到正在运行的应用程序中。所有其他活动都应该取消。您使用的是VS 2010,因此您可以创建任意数量的自己的宏和热键!:)