是否有可能强制C#编译器将所有引用的调用从框架中提取出来并打包成dll甚至单个可执行文件?
我喜欢使用C#编写快速的“一次性”应用程序,但是我不想在目标计算机上安装整个框架。
你问的问题有点含糊。C# 仅仅是一种编程语言,不需要 .NET Framework。编译它的过程需要编译器,该编译器可能或可能不会依赖于 .NET Framework(Microsoft 的 C# 编译器并不依赖 -- 它是用本地代码编写的)。你的程序需要引用一些程序集,以便使用其中的类型、类和方法。你可以从引用列表中删除 system.dll 和 mscorlib.dll 并引用自己的程序集。因此,如果你真的努力工作,可以避免对 .NET Framework 的依赖。但最终,除非你有一个将程序编译为本地代码的 C# 编译器,否则你仍然依赖于 CLR。
这段话在技术上表述得很抽象,几乎没有讲到什么。但它回答了你的问题。 :) 更实际有用的是如何让你的 C# 程序运行时依赖尽可能少的程序。mono 中的 mkbundle 实际上可以让你将所有内容编译成一个几乎不依赖其他程序的 .exe 文件。
但如果你想继续使用微软的 .NET Framework,你可以通过使用 .NET 3.5 SP1 的客户端配置文件来实现更轻量级、更快速安装常用依赖项的效果。你可以在这里阅读更多信息: http://msdn.microsoft.com/en-us/library/cc656912.aspx
mono
的铁杆粉丝,但这只是因为维护模拟器非常困难,而且在最好的情况下也很容易出错(在我看来)。 - Mike Perrenoud看看使用Mono的mkbundle。
使用Microsoft .NET Native现在可以将C#编译为本地代码:
https://msdn.microsoft.com/zh-cn/library/dn584397(v=vs.110).aspx它自动将使用托管代码(C#或Visual Basic)编写且针对.NET Framework和Windows 10的应用程序的发布版本编译为本机代码。
...
对于您的应用程序用户,.NET Native提供以下优势:
•快速执行时间
•始终如一的快速启动时间
•低部署和更新成本
•优化的应用程序内存使用
这仅适用于Visual Studio .NET 2015。
不可能的。你的“编译”后的C#应用程序是一种语言,.Net CLR在运行时解释(应该说是JITed,读取IL,编译为本机代码,然后调用已编译的本机代码)。
顺便说一下,.net 2.0是xp SP2和vista的标准安装,所以你不会付出太大的代价。
你可以研究一下mono,但这仍然涉及在目标机器上运行某种框架。
unsafe
关键字和平台调用功能(extern
关键字)并不会将C++、C或汇编嵌入到C#中。虽然unsafe
允许直接指针操作,但extern
只允许您调用非托管库中的方法。我甚至认为它们并没有特别相关,而且与问题也没有什么关系。 - tomfanning这种依赖关系在现实世界中经常会出现问题或者缺失,这是 C# 没有更广泛应用的一个重要原因。另一方面,大多数开发确实都有依赖关系...例如 C++ 和 Java。
我认为我们不可能很快摆脱这些依赖关系问题,所以如果你想使用 C#,我建议你制作一个安装包包装器,检查你需要的 .net framework 版本依赖关系,如果缺失则通知用户他们需要此项才能运行你的应用程序。
yield return
需要IEnumerable接口
using (x) {}
需要IDisposable接口