2014-03-26 51 views
3

我一直在寻找一种编译指定目标平台的.NET程序集的方法。 目标是让IL和整个程序集编译成独立于.NET运行时的独立可执行文件。将.NET程序集编译为给定的目标平台二进制文件

我读过很多文章和评论,为什么它不能完成,但我很好奇 - 任何人都可以提出一些想法?

更新:微软宣布推出“.NET Native”预览版。见here。 按照FAQ

问:如何连接工作?框架代码是否被编译到应用程序中?

答:是的,框架代码将被编译到应用程序

现在听起来不错。不过我想知道BuildDefinitions和自定义优化(目前:使用VC++ opt。)。

+0

什么是您所指定的特定平台?它是不是由[mono](http://mono-project.com/Main_Page)支持? – Bauhaus

+0

@Bauhaus让我们来说说所有这些:)认为BuildDefinitions和本地非Windows设备 – Ash

+2

一些单声道派生产品(如MonoTouch)能够做到这一点。你需要的大部分代码已经在Mono AOT中。 –

回答

3

如果你的.NET组件能够在Mono上运行,它可以使用单声道生产运行的可执行文件,而无需最终用户拥有.NET Framework或Mono。事实上,我认识的几个开发人员(包括我自己)正在这样做(主要针对* nix目标平台,但也可以针对Windows完成)。

虽然首先需要注意的是,自Windows XP以来,.NET Framework 2.0已经包含在Windows安装中。如果您可以定位该框架,那么很少有Windows用户需要安装.NET Framework来运行您的应用程序。如果可能的话,我会追求这个选择。

如果这是不可能的,那么我会使用Mono的mkbundle工具。 mkbundle在其运行的平台上生成本机可执行文件。不幸的是,我没有确切的步骤让你在Windows上运行它;我只在Linux和Mac上使用过它。

+0

我的意图是提供它作为服务,在Linux上运行,这对我来说听起来很不错。但是我必须尝试一下,我从来没有用过mkbundle。 – Ash

+1

Windows 8默认禁用.NET 2.0,3.0和3.5。 – hyru

-1

它是一个.NET应用程序,它将依赖于.NET运行时。它提供了只是几件事情:

  1. 组件在GAC一个庞大的数字,每一个.NET应用程序使用(认为系统命名空间,等等)
  2. JIT编译器把IL转换成可执行代码。
  3. 注册表项和其他所需的系统修改。

将所有这些编译到单个应用程序中并不实际,不可取,或者确实可行。你可能会用你的应用打包.NET框架并安装它(推荐的方法)。我相信你甚至需要用单声道安装(基于同样的原因,我确定)。

我知道你在寻找不同的解决方案,但真正的答案是.NET不支持这种类型的编译。

+0

是的,你所说的都是有道理的,我很清楚这一点。 这可能是一个死路,但我希望有一些聪明的方法来实际建立所有的依赖关系(希望)。 事实上,我会失去所有虚拟化,但让我们假设它是可以接受的。 – Ash

-1

实际上有些工具将c#代码转换为C++代码,实际上是将C++代码转换成C++代码。然后你可以直接编译C++代码。但它目前正在开发中,它可能需要一段时间才能使用。

这就是所谓的代码折射,它是从这里得到:http://coderefractor.blogspot.ro/search?updated-min=2014-01-01T00:00:00-08:00&updated-max=2015-01-01T00:00:00-08:00&max-results=10

+0

太棒了,但引用程序集呢?你只能得到编译后的IL ... – Ash

+0

这取决于你。作者说,你需要自定义包装的默认引用.net程序集 – Alecu

+0

不是我已经深入了解它,但在我看来,莫诺的mkbundle(由史密斯先生提议)是一个更好的主意。这种方法涉及太多的额外工作,包括一些反编译等。 – Ash

0

我一直在使用可移植类库(PCL),它们工作得很好。基本上,它是.Net的子集,可以运行在多个设备上(它是专门为此设计的)。

您可以使用Linq,async/await,lambdas等,因此您拥有C#的所有语法功能。

唯一需要注意的是许多.Net库不可用(比如加密技术)。解决方法通常是在Nuget上找到PCL移植版本的库,或者自行复制一些.Net功能。 - 这个限制实际上受到了Microsoft的鼓励,因为他们声称PCL应该使用来自其他库的依赖注入来启用缺失的功能。例如,您的XBox项目可能会实现PCL上缺少的加密库,并且应该注入您的PCL项目以在运行时使用XBox的类(通过接口等);后来你可以为Android做类似的事情,并且你的Android库会将加密库注入到PLC中,但PLC逻辑本身不需要改变,并且对于XBox和Android项目都是一样的。

这里有更多关于它http://msdn.microsoft.com/en-us/library/vstudio/gg597391(v=vs.110).aspx

2

我不能发表评论(我有声誉的没有50分),但我,所以我想澄清这个项目CodeRefractor的创造者:

  • 我认为Mono和--full-aot标志是比CodeRefractor更好的目标,因为Mono在商业上受到支持,它具有更多的资源(阅读:开发人员在运行时的所有组件上工作)和更长的历史

  • CR是一个免费/爱好项目,它会保持原样,除了我自己以外没有看到很多贡献者(实际上没有,不包括评论:请添加此内容,否则CR会处理该内容)。仅仅因为这个原因,我主要关心如何优化CIL操作码,而不是稳固实现.Net。另外,我将使用项目设计作为学士论文

  • 对于非常密集的数学代码,如果您想剖析C/C++生成的代码,CodeRefractor可以在这里帮助您,但实际运行时库非常有限。您可能需要编写自己的PInvoke库来输入和输出数据。这是说实话,有点难!

  • CR有一些不错的表现默认值:如果代码遵循一些简单的规则,将有可能在Java的服务器编译器的范围内,或手工优化的C++的性能。其中一个原因也是因为CR不检查循环的范围,也没有例外。所以,如果你幸运的话,你可以获得非常好的表现!

  • CodeRefractor具有有趣的优化,至少在理论方面。这意味着如果您真正了解执行哪些优化,您可以获得非常好的性能。它与GCC编译器中的LTO非常相似,并且是多层优化,如果使用常量,它们运行得非常好,它们将被优化,包括死代码! CodeRefractor作为目标是删除。通过提供(某种程度上)C++可读代码,可以将其至少复制/粘贴到C++代码或在需要时对其进行调整。这也意味着,将有总有一些边缘案件C++不会映射正确的CIL代码,例如在多线程的区域(含挥发物)

因此,作为最终的答案:看看单声道和 - -aull-aot标志。如果CodeRefractor能够为你工作,那将是非常棒的,但如果它现在能够实现,我会留下深刻的印象!也许在3 - 4年后,如果人们会支持它(或者一家公司,谁知道),否则就像大多数人那样,只是阅读博客。

如果您有兴趣了解CR的设计,你可以从文件夹阅读: https://github.com/ciplogic/CodeRefractor/blob/master/Documentation/BarchelorPaper2014.docx

相关问题