将.net程序集编译为给定的目标平台二进制文件
本文关键字:目标 平台 二进制文件 net 程序集 编译 | 更新日期: 2023-09-27 17:53:39
我一直在寻找一种为指定目标平台编译. net程序集的方法。目标是将IL和整个程序集编译成独立于。net运行时的、独立的可执行文件。
我读了很多文章和评论为什么它不能做到,但我很好奇-谁能想出一些想法?
UPDATE: Microsoft宣布NET Native"预览版可用。在这里看到的。根据FAQ:
问:链接是如何工作的?框架代码是否被编译到应用程序中?
A:是的,框架代码将被编译成应用程序
这听起来很令人兴奋。我想知道关于BuildDefinitions和自定义优化(目前:vc++ opt.被使用)。
如果您的。net程序集能够在Mono上运行,则可以使用Mono生成一个可执行文件,而不需要最终用户拥有。net框架或Mono。事实上,我知道有几个开发人员(包括我自己)正在这样做(主要针对*nix目标平台,但也可以为Windows完成)。
首先要注意的是,. net Framework 2.0从Windows XP开始就已经包含在Windows安装中了。如果你能瞄准这个框架,很少有Windows用户需要安装。net框架来运行你的应用程序。如果可能的话,我会选择这个选项。如果这是不可能的,那么我会使用Mono的mkbundle
工具。mkbundle
在运行它的平台上生成一个本机可执行文件。不幸的是,我没有为您提供在Windows上运行它的确切步骤;我只在Linux和Mac上使用过。
我不允许评论(我没有50点声誉),但我是CodeRefractor的创建者,所以我想澄清一下这个项目:
-
我认为Mono和——full-aot标志是一个比CodeRefractor更好的目标,因为Mono是商业支持的,它表面上有更多的资源(即:在运行时的所有组件上工作的开发人员)和更长的历史
-
CR是一个免费/爱好项目,它将保持这样,因为我没有看到很多贡献者以外的我自己(事实上没有,除了评论:请添加这个,或者CR处理那个)。仅仅因为这个原因,我最感兴趣的是如何优化CIL操作码,而不是成为。net的可靠实现。此外,我将使用项目设计作为学士论文
-
对于非常密集的数学代码,如果你想分析C/c++生成的代码,CodeRefractor可以在这里帮助你,但实际的运行时库非常有限。您可能需要编写自己的PInvoke库来输入和输出数据。说实话,这有点难!
-
CR有一些良好的性能默认值:如果代码遵循一些简单的规则,则可能具有Java的服务器编译器范围内的性能,或者手工优化的c++。其中一个原因是CR不检查循环的范围,也没有异常。所以,如果你幸运的话,你可以得到很好的表现!
-
CodeRefractor进行了有趣的优化,至少在理论上是这样。这意味着如果您真正尝试了解执行了哪些优化,就可以获得非常好的性能。它的工作原理与GCC编译器中的LTO非常相似,并且是多层优化,如果您使用常量,它们将被优化出来,包括死代码!
-
CodeRefractor的目标是通过提供(某种程度上)c++可读的代码来消除。net依赖,这些代码至少可以复制/粘贴到你的c++代码中,或者在需要时进行调整。这也意味着总是会有一些c++不能正确映射CIL代码的边缘情况,比如在多线程领域(带有volatile)
所以作为最后的答案:看看Mono和——full-aot标志。如果CodeRefractor能为你工作,那就太好了,但如果它现在能做到这一点,我就会印象深刻了!也许在3-4年后,如果有人会支持它(或一个公司,谁知道呢),否则就像大多数人一样,只是在博客上读它。
如果你对CR的设计感兴趣,你可以从文档文件夹中阅读:https://github.com/ciplogic/CodeRefractor/blob/master/Documentation/BarchelorPaper2014.docx
我一直在使用可移植类库(PCL),它们工作得很好。基本上,它是。net的一个子集,可以在多种设备上运行(它是专门为此目的而设计的)。
您可以使用Linq, async/await, lambdas等,因此您拥有c#的所有语法功能。
唯一需要注意的是,许多。net库是不可用的(比如Cryptography);解决方法通常是在Nuget上找到一个pcl移植版本的库,或者自己复制一些。net功能。-这个限制实际上是微软鼓励的,因为他们声称你的PCL应该使用其他库的依赖注入来启用缺失的功能。例如,你的XBox项目可能会实现PCL上缺失的加密库,你的PCL项目应该被注入以在运行时使用XBox的类(通过接口等);之后你可以在Android上做类似的事情,你的Android库会将加密库注入PLC,但PLC逻辑本身不需要改变,对于XBox和Android项目都是一样的。
这里有更多关于它的信息http://msdn.microsoft.com/en-us/library/vstudio/gg597391(v=vs.110).aspx
这是一个。net应用程序,它将依赖于。net运行时。它提供了一些东西:
- GAC中每个。net应用程序使用的大量程序集(想想系统名称空间,以及许多其他程序集)
- JIT编译器将IL转换为可执行代码。
- 注册表项和其他必要的系统修改
将所有这些编译到单个应用程序中是不实际的,不可取的,也不可能的。你也可以将。net框架打包到你的应用程序中,然后直接安装它(推荐的方法)。我相信你甚至需要安装mono(出于同样的原因,我敢肯定)。
我知道你在寻找一个不同的解决方案,但真正的答案是。net不支持这种类型的编译。
实际上存在一些将c#代码转换为c++代码的工具,实际上是将il指令转换为c++代码。然后你可以直接编译c++代码。但它目前还在开发中,可能需要一段时间才能投入使用。
它被称为Code Refractor,可以从这里获得: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