Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将.NET程序集编译为给定的目标平台二进制文件_C#_C++_.net_Compilation_Il - Fatal编程技术网

C# 将.NET程序集编译为给定的目标平台二进制文件

C# 将.NET程序集编译为给定的目标平台二进制文件,c#,c++,.net,compilation,il,C#,C++,.net,Compilation,Il,我一直在寻找一种为指定目标平台编译.NET程序集的方法。 目标是将IL和整个程序集编译成独立于.NET运行时的独立可执行文件 我读过很多关于为什么不能这样做的文章和评论,但我很好奇——有人能想出一些主意吗 更新:微软宣布推出.NET本机预览版。看见 根据报告: 问:链接是如何工作的?框架代码是否编译到应用程序中 答:是的,框架代码将编译到应用程序中 听起来很刺激。我想知道构建定义和自定义优化(目前使用的是VC++opt.)。它是一个.NET应用程序,它将依赖于.NET运行时。它只提供了一些东西:

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

我读过很多关于为什么不能这样做的文章和评论,但我很好奇——有人能想出一些主意吗

更新:微软宣布推出.NET本机预览版。看见 根据报告:

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

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


听起来很刺激。我想知道构建定义和自定义优化(目前使用的是VC++opt.)。

它是一个.NET应用程序,它将依赖于.NET运行时。它只提供了一些东西:

  • GAC中有大量的程序集,每个.NET应用程序都使用这些程序集(想想系统名称空间,以及其他许多程序集)
  • JIT编译器将IL转换为可执行代码
  • 注册表项和其他所需的系统修改
  • 将所有这些编译到一个应用程序中是不实际的、不可取的,也不是真正可能的。您还可以将.NET framework与应用程序打包,然后安装它(推荐的方法)。我相信你甚至需要用mono安装(我相信原因与此大致相同)


    <>我知道你在寻找一个不同的解决方案,但是真正的答案是.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库来输入和输出数据。老实说,这有点难

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

    • CodeRefractor进行了有趣的优化,至少在理论方面是如此。这意味着,如果您真正尝试了解执行了哪些优化,那么您可以获得非常好的性能。它的工作原理与GCC编译器中的LTO非常相似,并且是多层优化,如果您使用常量,它们将得到优化,包括死代码

    • < > >代码编辑器,目标是通过提供(有点)C++可读代码来删除.NET依赖关系,代码至少可以复制/粘贴到您的代码中。