2011-07-31 37 views
4

我有一个.NET C#应用程序,应该只在一台已知配置的计算机上运行(HP DL120 G7,Xeon E3-1220,Windows Server 2008 R2 Foundation,如果这很重要的话)。我不需要在其他计算机上运行此应用程序。如何编译用于CPU优化的.NET应用程序?

我想:

  • 使其尽可能快的(即可能与“使用至强E3-1220”键或编译的东西?)
  • 将其固定一点点(应该从二进制文件恢复C#源代码不是微不足道的)。

我应该以某种方式编译为本地Windows代码吗?可能我应该使用一些特殊的编译器选项?

回答

4

您可以在“发布”模式下对其进行编译以启用优化。此外,您可以运行ngen.exe来生成原生DLL,这不会产生JIT的开销。

但是,请记住,所有这些措施和工具对于编写不好的代码并不是一个银弹(并不是说你的是)。你应该分析你的应用程序,看看你是否可以即兴编写任何代码路径的执行时间,以及找出较慢的路径(并试图改进它们)。

为了保护它,使用一个很好的混淆器,如(Salamander,SmartAssembly等)。它不会完全难以辨认,但会让它变得更加困难。

绝对保护它,用C++代码!您可以使用/clr选项进行编译,这将使它们成为immune to reflection并进行反汇编。

+0

所以如果我不在乎启动时间,但我只关心“执行”时间,我不需要ngen?我能以某种方式编译在目标平台上使用的代码以实现最大程度的优化吗? (hm或可能.net运行时会为我做这件事) – javapowered

+0

好吧,还有其他好处,比如_processes_之间的较小的工作集和图像共享。 Jitted程序集不能共享,因为它们对于AppDomain是私有的。也有一些警告,我建议你阅读本文[MSDN](http://msdn.microsoft.com/en-us/library/6t9t5wcf.aspx)文章以获得充分理解。 – Mrchief

1

您可以使用ngen来创建和缓存组件的优化原生图像。

2

很容易从.Net程序集恢复代码。你可以通过混淆内容(谷歌为此)去某种方式。

至于编译,CLR会在进程启动时有效地进行编译 - 您不必担心这一点。如果启动时间很长,您可以使用NGEN(AOT编译器)编译程序集:

http://en.wikipedia.org/wiki/Native_Image_Generator

如果你想确保它的快速,确保你在释放模式编译虽然与最佳化(它将在您的项目属性中)。

相关问题