当前位置: 首页 > 编程语言 > C#

将.NET应用程序转换为x86原生代码分享

时间:2023-04-10 14:43:26 C#

将.NET应用程序转换为x86原生代码有一个完全用C#编写的程序,它面向.NETFramework2.0。有没有办法以某种方式将托管EXE编译(翻译)为本机EXE,因此它可能与.NET无关?我知道这可能有商业产品……但它们有点贵。问题是我们想在没有安装.NETFramework的情况下在运行WindowsXP的计算机上部署程序。还要求程序的大小不超过500Kb(最大1Mb),因为它是从Web服务器下载的(现在大小为255Kb)。这就是为什么我们不能将完整的.NETFX(即使是简化的)附加到下载程序的文件中。显然,这是一个可怕的软件工程错误,应该及早发现并避免,这样我们就可以使用C++等原生技术。我们现在已经试用了Novell的Mono——一个用于Linux、MAC和Windows的.NETFramework的开源实现。Mono由C#编译器、IDE、运行时(CLR)和类库程序集(如System.dll和mscorlib.dll-非常类似于安装到GAC的.NET类库程序集)组成。我们尝试做的是找到CLR文件并将它们与我们的程序文件和一些程序集一起发送。这样,可以通过在用户计算机上运行“monoprogram.exe”(命令提示符)来调用该程序。除了使用最终用户CLR文件(mono.exe和mono.dll)带来的不便外,它总共大约2.5Mb,比所需的500Kb甚至1Mb大得多。所以,我们别无选择,只能通过编译器将我们的.NET应用程序转换为本机应用程序,但问题仍然存在——我们应该使用什么编译器以及我们在哪里可以找到它……目前我偶然发现了MicrosoftTheInstitute的SingularityOS项目.它是一个开源研究操作系统,用托管代码编写(至少部分)。SingularityOS包括一个Bartok编译器,操作系统使用该编译器将托管程序转换为本机程序(x8632位)。需要注意的是,Bartok无法将.NET2.0的所有方面都转换为本机代码,但大多数都可以。但是我还没有学会如何使用Singularity......如果你能提供一些关于问题的有用提示和建议,你自己使用SingularityOS和BartokCompiler的经验,或者我忽略的其他解决问题的方法以及如何解决它,我会非常感谢你。非常感谢您!最后,使用Mono的完整AOT功能(根据CallumRogers的建议)我设法生成了缺少CLI标头的program.exe.dll。所以它看起来像一个本机DLL。但是,我不知道如何将该DLL转换为exe或使其运行。这个dll似乎也没有公开任何感兴趣的功能,比如main函数。查看Mono项目中的AOT(提前)编译。这会将您的托管项目编译为本机exe或elf可执行文件(取决于您的目标系统),而无需JIT。这是用于向iPhone添加单声道应用程序的技术(不允许JIT/Framework),并且还具有启动时间更快、内存使用率更低以及人们更难反编译代码的额外好处。你说你已经在使用Mono,所以它应该是兼容的。在mono-project.com网站和MigueldeIcaza的博客(以及iPhone信息)上阅读相关信息。请注意,您不能使用动态代码或通用接口interfaceIFoo{...voidSomeMethod();}并且您必须编译您使用的所有库的DLL。PS:确保对您的问题使用“完整”AOT。Update2018在Build2018中,微软公布了支持Windows桌面应用程序(Winform和WPF)的WinNet3.0路线图Update2017对于控制台应用程序,可以使用.netcoreSelf-ContainedDeployment(SCD)。即使是helloworld应用程序,您的捆绑包也将超过50MB。您仍然需要安装VC运行时。更新正如@jenix评论的那样,.NETNative仅适用于Windows应用商店应用(UWP)。经过3年的宣布仍然如此,用于桌面的.NETNative可能会被Microsoft删除。所以这个答案不再适用。========Microsoft在Build2014上发布了.NETNativePreview使用.NETNativeDeveloperPreview,应用程序作为完全独立的本地编译代码部署在最终用户设备上,不依赖于.NETFramework设备/计算机。因此,使用.NETNative的目标计算机上不需要.NETFramework。宣布.NETNativePreviewMicrosoft.NETNative有一个名为CrossNet的项目,它解析.Net程序集并生成可以在任何标准编译器中编译的非托管C++代码。不是.NET到本机转换的真正解决方案,但也许这有帮助:http://www.yoda.arachsys.com/csharp/faq/#framework.required除了仔细重写应用程序之外不太确定你可以做多很多。为了简化已经恶化的过程,您可以使用类似Reflector(到MicrosoftC++中)的东西来反汇编.NET应用程序,并将其用作启动和替换托管C++的基础,仅使用本机C++引用+引用。以上就是《C#学习教程:Converting.NETApptox86NativeCodeSharing》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: