C# 将.NET程序集编译为给定的目标平台二进制文件
我一直在寻找一种为指定目标平台编译.NET程序集的方法。 目标是将IL和整个程序集编译成独立于.NET运行时的独立可执行文件 我读过很多关于为什么不能这样做的文章和评论,但我很好奇——有人能想出一些主意吗 更新:微软宣布推出.NET本机预览版。看见 根据报告: 问:链接是如何工作的?框架代码是否编译到应用程序中 答:是的,框架代码将编译到应用程序中C# 将.NET程序集编译为给定的目标平台二进制文件,c#,c++,.net,compilation,il,C#,C++,.net,Compilation,Il,我一直在寻找一种为指定目标平台编译.NET程序集的方法。 目标是将IL和整个程序集编译成独立于.NET运行时的独立可执行文件 我读过很多关于为什么不能这样做的文章和评论,但我很好奇——有人能想出一些主意吗 更新:微软宣布推出.NET本机预览版。看见 根据报告: 问:链接是如何工作的?框架代码是否编译到应用程序中 答:是的,框架代码将编译到应用程序中 听起来很刺激。我想知道构建定义和自定义优化(目前使用的是VC++opt.)。它是一个.NET应用程序,它将依赖于.NET运行时。它只提供了一些东西:
听起来很刺激。我想知道构建定义和自定义优化(目前使用的是VC++opt.)。它是一个.NET应用程序,它将依赖于.NET运行时。它只提供了一些东西:
<>我知道你在寻找一个不同的解决方案,但是真正的答案是.NET不支持这种编译。 < P>实际上,有一些将C代码转换成C++代码的工具,实际上是IL指令到C++代码中。然后可以直接编译C++代码。但它目前正在开发中,可能需要一段时间才能使用
它被称为代码折射器,可以从这里获得:如果.NET程序集能够在Mono上运行,则可以使用Mono生成运行的可执行文件,而无需最终用户使用.NET Framework或Mono。事实上,我知道有几个开发人员(包括我自己)正在这样做(主要针对*nix目标平台,但也可以针对Windows) 不过,首先要注意的是,自Windows XP以来,.NET Framework 2.0已作为Windows安装的一部分包括在内。如果您可以针对该框架,那么很少有Windows用户需要安装.NET framework来运行您的应用程序。如果可能的话,我会追求这一选择
如果不可能,那么我将使用Mono的
mkbundle
工具mkbundle
在其运行的平台上生成本机可执行文件。不幸的是,我没有确切的步骤让你在Windows上运行它;我只在Linux和Mac上使用过它。我一直在使用可移植类库(PCL),它们工作得很好。基本上,它是.Net的子集,可以在多个设备上运行(它是专门为此而设计的)
您可以使用Linq、async/await、lambdas等,因此您拥有C#的所有语法功能
唯一需要注意的是,许多.Net库都不可用(如加密);解决方法通常是在Nuget上找到该库的PCL移植版本,或者自己复制一些.Net功能。
-这一限制实际上受到了Microsoft的鼓励,因为他们声称您的PCL应该使用来自其他库的依赖项注入来启用缺少的功能。例如,您的XBox项目可能实现PCL上缺少的加密库,您的PCL项目应该被注入,以便在运行时(通过接口等)使用XBox的类;稍后,您可以对Android执行类似的操作,您的Android库会将加密库注入PLC,但PLC逻辑本身不需要更改,对于XBox和Android项目都是相同的
以下是关于它的更多信息我不允许发表评论(我没有50点声誉),但我是CodeRefractor的创建者,因此我想澄清一下这个项目:
- 我认为Mono和--full aot标志是一个比CodeRefractor更好的目标,因为Mono是商业支持的,它表面上有更多的资源(阅读:在运行时的所有组件上工作的开发人员)和更长的历史
- CR是一个免费/爱好项目,它将保持这样的状态,因为除了我自己之外,我没有看到太多的贡献者(事实上没有,除了评论:请添加这个,或者CR处理那个)。仅出于这个原因,我对如何优化CIL操作码最感兴趣,而对如何实现.Net更感兴趣。此外,我将把项目设计作为学士论文
- 对于非常数学密集的代码,如果您想评测C/C++生成的代码,CodeRefractor可以在这里帮助您,但实际的运行库非常有限。您可能需要编写自己的PInvoke库来输入和输出数据。老实说,这有点难
- CodeRefractor进行了有趣的优化,至少在理论方面是如此。这意味着,如果您真正尝试了解执行了哪些优化,那么您可以获得非常好的性能。它的工作原理与GCC编译器中的LTO非常相似,并且是多层优化,如果您使用常量,它们将得到优化,包括死代码 < > >代码编辑器,目标是通过提供(有点)C++可读代码来删除.NET依赖关系,代码至少可以复制/粘贴到您的代码中。
CR有一些良好的性能默认值:如果代码遵循一些简单的规则,那么在java服务器编译器的范围内或在手工优化C++中可能会有性能。其中一个原因也是因为CR不检查循环的范围,也没有异常。所以,如果你幸运的话,你可以得到非常好的表现