帮我理解Resharper背景编译

时间:2010-08-22 16:18:57

标签: c# resharper compilation

因此Jeff Atwood正确地抱怨Visual Studio没有执行后台编译,请参阅:http://www.codinghorror.com/blog/2007/05/c-and-the-compilation-tax.html

来自大多数来源的解决方案似乎是Reshaper,它会在您编写时逐步执行后台编译。这导致了他们伟大的实时重新分解技巧和错误检测。

但是我不明白的是R#不断编译我的代码,为什么通过VS执行编译需要这么长时间(即Ctrl + Shift + B或类似代码)。我的意思是,如果R#已经编译了我的代码,为什么我需要重新编译?

我的假设当然是R#不会覆盖我的bin目录中的程序集,而是将编译结果保存在内存中。在这种情况下,是否可以告诉R#在编译成功时简单地覆盖我的程序集?

3 个答案:

答案 0 :(得分:7)

我不知道“正确抱怨” - 这是我碰巧不同意的观点:)

然而,VB.NET(可能还有Resharper c#)后台编译器实际上并没有编译完整的程序集 - 它们不能!如果您考虑一下,在您工作时代码的自然状态是不可编译的!几乎每次按键都会使您的代码处于无效状态。想想这一行:

var x = new Something();

当你键入它时,从键“v”到键“)”,你的代码是“错误的”。或者,如果您正在引用尚未定义的方法,该怎么办?如果这个代码在另一个程序集需要的程序集中,你将如何编译第二个程序集,背景与否?

后台编译器通过将代码的小块编译成多个瞬态“程序集”来实现这一点,这些“程序集”实际上只是元数据持有者 - 实际上,它们并不关心代码的实际影响,就像定义的符号一样多,当你最终点击构建时,仍然需要构建实际的完整程序集。

所以不,我不相信这是可能的,因为它们不是为了进行实际的完整编译而构建的 - 它们是为了检查代码并动态解释符号而构建的。

答案 1 :(得分:4)

  

在您编写时将逐步执行后台编译的重塑器

它没有,它只是解析源代码。如果你没有Resharper,Visual Studio已经做了完全相同的事情,那就是它如何实现IntelliSense,它自己的重构功能以及GoTo Definition和Find All References等命令。 Visual Studio还会在后台解析,在您键入时更新其数据。 Resharper只是通过解析数据实现了更多的花里胡哨。

从解析代码到实际生成程序集是一个非常重要的步骤。程序集的内部格式过于复杂,不允许在后台发生这种情况,而不会影响计算机的响应能力。

C#编译器仍然是一大块非托管C ++代码,独立于IDE。必须首先使用编译器的必然结果。然而,下一版本的C#规定了提供按需编译服务的目标。获得真正的背景编译是可能的。

答案 2 :(得分:0)

我真的没有答案,但我只想说我已经使用Eclipse和Java 4个月了,我喜欢自动编译。我有一个非常大的java代码库,当我保存代码更改时,编译会不断发生。当我点击Run时,一切都准备好了!它真棒。在我进行代码更改时,它还会自动部署到本地Web服务器实例(在我的情况下为Tomcat)。所有这些都默认在Eclipse中设置。

我希望微软在不久的将来能与.net做类似的事情。