mono是一个旨在允许开发人员轻松创建跨平台应用程序的软件平台。它是基于C#和通用语言运行时的ECMA标准的Microsoft .NET框架的开源实现。
mono项目是.NET基金会的一部分
重要的
自2001年启动以来, mono Project( mono / mono )(“原始mono ”)一直是.NET生态系统的重要组成部分。微软在2016年收购了Xamarin时成为mono Project的管家。
该mono项目的最后一个主要版本是在2019年7月,从那时起就发布了较小的补丁。最后一个补丁发布是2024年2月。
我们很高兴地宣布,Winehq组织将接任Wine- mono / Mono / mono ·Gitlab(Winehq.org)上游的mono项目的管家。现有的mono / mono和其他存储库中的源代码仍将可用,尽管可以存档存储库。二进制文件将保持长达四年。
Microsoft在Dotnet/运行时仓库中维护了现代的mono运行时叉,并且一直在将工作负载逐步移动到该叉子。这项工作现已完成,我们建议活跃的mono用户和基于mono声道的应用程序框架的维护者迁移到.NET,其中包括该叉子的工作。
我们要认识到, mono项目是Android,iOS,Linux和其他操作系统上的第一个.NET实现。 mono项目是许多操作系统的.NET平台的开拓者。它有助于使跨平台.NET成为现实,并在许多新地方启用了.NET,我们感谢那些在我们面前的人的工作。
感谢所有的mono开发人员!
加入我们在# mono vm频道中的Discord:
内容
- 汇编和安装
- 使用mono
- 目录路线图
- 为mono做出了贡献
- 报告错误
- 配置选项
- 使用子模型
建立状态
公共CI:
传统詹金斯CI(不再公开可用):
| 操作系统 | 建筑学 | 地位 |
|---|---|---|
| Debian 9 | AMD64 | |
| Debian 9 | I386 | |
| Debian 9 | 臂章 | |
| Debian 9 | Armhf | |
| Debian 9 | ARM64 | |
| OS X | AMD64 | |
| OS X | I386 | |
| 视窗 | AMD64 | |
| 视窗 | I386 | |
| Centos | S390X(CS) | |
| Debian 9 | PPC64EL(CS) | |
| AIX 6.1 | PPC64(CS) | |
| FreeBSD 12 | AMD64(CS) |
(CS)=社区支持的建筑
汇编和安装
构建软件
请参阅我们在Mac OS X,Linux和Windows上构建mono的指南。
请注意,从GIT构建假设您已经安装了mono ,因此请在尝试从Git构建之前下载并安装最新的mono版本。这是必需的,因为mono构建依赖于工作mono C#编译器(也称为Boottrapping)。
如果您没有工作的mono安装
如果您没有工作的mono安装,则可以尝试采用更风险的方法:获取最新版本的“ mono声道”发行版,其中包含足以运行“ MCS”编译器。您可以这样做:
monolite-latest\”>
# Run the following line after ./autogen.sh
make get- mono lite-latest
这将适当下载并放置文件,以便您可以运行:
make
然后,构建将使用make get- mono lite-latest下载的文件。
测试和安装
您可以使用命令运行mono和MCS测试套件: make check 。
期望找到一些测试套件失败。作为理智检查,您可以将自己的失败与https://jenkins.mo*no-pro*je*ct.com/进行比较。
您现在可以使用以下方式安装mono make install
您可以使用mono -Test -install脚本来验证安装,它可以诊断mono安装的一些常见问题。不遵循这些步骤可能会导致安装损坏。
使用mono
安装软件后,您可以运行一些程序:
-
mono program.exe运行时引擎 -
mcs program.csC#编译器 -
mono dis program.execil拆卸器
有关更多详细信息,请参见mono (1),MCS(1)和mono Dis(1)的人页。
目录路线图
-
acceptance-tests/– 可选的第三方测试套件,用于验证mono ,以针对更广泛的测试用例进行验证。 -
data/– 配置文件作为mono运行时的一部分安装。 -
docs/– 有关mono运行时的技术文档。 -
external/– 外部库(newtonsoft.json,ikvm等)的外部/ git子模型。 -
ikvm-native/– IKVM的胶水代码。 -
libgc/– (已弃用)BOEHM GC实施。 -
llvm/– 用于集成mono LLVM叉的实用程序files。 -
m4/– 通用公用事业。 -
man/– 各种mono命令和程序的手册页。 -
mcs/– 类库,编译器和工具-
class/– 类库(例如System。*,Microsoft.build等) -
mcs/– 用C#编写的mono C#编译器 -
tools/– gacutil,ikdasm,mdoc等工具等。
-
-
mono /– mono跑时间的核心。-
arch/– 建筑特定部分。 -
benchmark/– 基准集合。 -
btls/– 为包含Boringssl的BTLS库构建文件。 -
cil/– 公共中间表示,CIL字节码的XML定义。 -
dis/– CIL可执行拆卸器。 -
eglib/– GLIB API的独立实现。 -
metadata/– 对象系统和元数据读取器。 -
mini/– 正当编译器。 -
profiler/– PROFILER实施。 -
sgen/– SGEN垃圾收集器实施。 -
tests/– 主要运行时测试。 -
unit-tests/– 其他运行时单元测试。 -
运行时代码库中使用的
utils/– 实用程序功能。
-
-
msvc/– 基于MSVC / Visual Studio的运行时和BCL构建系统的逻辑。后者目前是实验性的。 -
OS X和Windows mono软件包的
packaging/包装逻辑。 -
po/– 翻译文件。 -
runtime/– 包含链接mono /和MCS/构建系统的makefile的目录。 -
samples/– 一些简单的示例程序,用于mono运行时用作嵌入式库。 -
scripts/– 用于调用mono和相应程序的脚本。 -
support/– 各种支持库。 -
tools/– 一系列工具,主要在mono开发过程中使用。
为mono做出了贡献
在提交mono声道更改之前,请查看贡献指南。请特别注意“重要规则”部分。
报告错误
要提交错误报告,请在mono GitHub存储库上打开一个问题。
请使用搜索设施来确保尚未提交相同的错误,并遵循我们有关如何制作好的错误报告的指南。
配置选项
以下是mono可能想使用的配置选项:
-
--with-sgen=yes,no– 世代GC支持:使用SGEN垃圾收集器启用或禁用mono运行时的汇编。- 在支持它的平台上,在构建mono之后,您将拥有一个
mono -boehm二进制和mono -sgen二元。mono -boehm使用BOEHM,而mono -sgen使用简单的世代GC。
- 在支持它的平台上,在构建mono之后,您将拥有一个
-
--with-libgc=[included, none]– 选择要使用的默认BOEHM垃圾收集器引擎。-
包括:(略微修改的BOEHM GC )这是BOEHM GC的默认值,它是最完整的功能,它将允许mono使用键入分配并支持调试器。
-
无:禁用包含Boehm垃圾收集器。
-
此默认为
included。
-
-
--enable-cooperative-suspend- 如果传递此标志,则将mono运行时配置为仅使用垃圾收集器的合作模式。如果您不传递此标志,则可以在运行时控制合作GC模式,通过设置
mono _ENABLE_COOP_SUSPEND标志。
- 如果传递此标志,则将mono运行时配置为仅使用垃圾收集器的合作模式。如果您不传递此标志,则可以在运行时控制合作GC模式,通过设置
-
--with-tls=__thread,pthread-
控制mono应如何访问线程本地存储,Pthread强迫mono使用pthread API,而__Thread则使用编译器优化的访问权限。
-
尽管__线程更快,但需要编译器,内核和LIBC的支持。旧的Linux系统不支持__Thread。
-
该值通常是预先配置的,除非您试图调试问题,否则无需设置它。
-
-
--with-sigaltstack=yes,no-
实验:众所周知,出于您自己的风险,它会引起垃圾收集问题,并且很难再现这些错误。
-
这控制了mono是否会安装特殊信号处理程序来处理堆栈溢出。如果设置为
yes,则将堆栈溢出变成stackoverflowException。否则,当堆栈溢出发生时,您的程序将收到细分故障。 -
配置脚本将尝试检测您的操作系统是否支持此。一些较旧的Linux系统不支持此功能,或者您可能需要覆盖自动检测。
-
-
--with-static_ mono =yes,no-
这控制了
mono是否应与静态库(lib mono .a)或共享库(lib mono .So)链接。 -
默认为
yes,并将提高mono程序的性能。 -
这只会影响“ mono ”二进制,共享库lib mono .So将始终为想要将运行时嵌入其应用程序嵌入的开发人员生产。
-
-
--with-xen-opt=yes,no– 优化XEN虚拟化的代码。-
它使mono生成的代码平均可能会稍慢一些,但是在XEN虚拟化系统下,由此产生的可执行文件将更快地运行。
-
这默认为
yes。
-
-
--with-large-heap=yes,no– 启用大于3GB的GC堆的支持。-
这仅适用于BOEHM垃圾收集器,SGEN垃圾收集器不使用此配置选项。
-
此默认为
no。
-
-
--enable-small-config=yes,no– 启用一些调整以减少记忆使用和磁盘占地面积,但以某些功能为代价。-
通常,这意味着可以创建的线程数受到限制(256),最大堆大小也减小(256 MB)和其他仍然使mono有用的限制,但更适合嵌入式设备(例如手机)。
-
此默认为
no。
-
-
--with-ikvm-native=yes,no– 控制IKVM JNI接口库是否构建。-
如果您打算使用mono使用IKVM Java虚拟机,则使用此方法。
-
这默认为
yes。
-
-
--with-profile4=yes,no– 是否要构建4.x配置文件库和运行时。- 这默认为
yes。
- 这默认为
-
--with-libgdiplus=installed,sibling,<path>– 在运行System.Drawing Tests时mono声道在其中搜索libgdiplus。-
它默认
installed,这意味着可以通过常规系统设置可以mono库。 -
sibling可以用来指定作为该目录( mono )的兄弟姐妹的libgdiplus。
-
-
或者,您可以指定通往libgdiplus的路径。
-
--enable-minimal=LIST-
使用此功能来指定您可能不想包括的可选运行时组件。这仅对嵌入需要mono功能子集的mono的开发人员有用。
-
该列表是应删除的逗号分隔的组件列表,这些列表是:
-
aot:禁用提前汇编的支持。 -
attach:支持mono 。管理组件和VMATTACH API(允许将代码注入目标VM) -
com:禁用com支持。 -
debug:下降调试支持。 -
decimal:禁用对系统的支持。 -
full_messages:默认情况下, mono带有一个完整的消息,用于错误代码。此功能关闭不常见的错误消息并降低运行时大小。 -
generics:仿制药支持。禁用此功能将不允许mono运行任何包含通用物质的2.0库或代码。 -
jit:从构建中删除JIT引擎,这降低了可执行文件的大小,并要求在执行前用完整的AOT编译虚拟机执行的所有代码。 -
large_code:禁用大型组件的支持。 -
logging:禁用对调试记录的支持。 -
pinvoke:支持平台调用服务,禁用此功能将对使用Dllimport的任何库进行支持。 -
portability:删除对mono _IOMAP的支持,这是用于简化不敏感的移植应用程序的环境变量,并混合了UNIX和Windows路径分离器。 -
profiler:禁用对默认分析器的支持。 -
reflection_emit:Drop System.Reflection.Emit支持 -
reflection_emit_save:在System.Reflection.emit中保存动态创建的汇编(assemblyBuilderAccess.save)的下降支持。 -
shadow_copy:禁用对AppDomain阴影副本的支持(如果您不打算使用AppDomains,则可以禁用此功能)。 -
simd:禁用对mono声道内在库的支持。 -
ssa:禁用SSA优化框架的汇编,以及基于SSA的各种优化。
-
-
-
--enable-llvm-
这使使用LLVM作为mono的代码生成引擎。将使用LLVM代码生成器和优化器,而不是在时间和提前汇编之前的mono内置代码生成器。
-
有关此功能的全部详细信息和最新信息,请参见https://www.mono-proj**e*ct.com/docs/advanced/ mono -llvm/。
-
您将需要建立mono可以链接的LLVM。
-
-
--enable-big-arrays– 启用具有大于int32.maxvalue的索引的数组。-
默认情况下, mono限制与Win32和Win64上的.NET相同,并且限制了数组索引为32位值(甚至在64位系统上)。
-
在某些需要大阵列的情况下,您可以传递此标志,并将建造mono以支持64位阵列。
-
这不是默认值,因为它打破了我们通过mono开发周期暴露的c嵌入ABI。
-
-
--enable-parallel-mark-
使用此选项使垃圾收集器能够使用多个CPU来完成其工作。这有助于在多CPU机器上进行性能,因为该工作跨CPU分开。
-
此选项当前不是OSX上的默认值,因为它遇到了问题。
-
此选项仅适用于BOEHM GC。
-
-
--enable-dtrace- 在Solaris和MacOS上,X构建了一个mono运行时的版本,该版本包含DTRACE探针,并可以使用DTRACE参与系统分析。
-
--disable-dev-random-
mono使用 /DEV /随机来获取需要随机数的任何来源的良好随机数据。如果您的系统不支持此,则可能需要将其禁用。
-
也有许多运行时选项可以控制此功能,请参阅《男人》页面。
-
-
--with-csc=roslyn,mcs,default-
使用此选项配置要使用的C#编译器。默认情况下,配置脚本将选择罗斯林,除非在Roslyn不起作用的平台上(大端系统)选择MC。
如果您指定“ MCS”,则将使用mono \’S C#编译器。这还允许从源头组成mono的核心编译器和核心库的完整引导程序。
-
如果指定“罗斯林”,则将使用罗斯林的C#编译器。目前,这使用了罗斯林二进制文件。
-
--enable-nacl-
这将配置mono编译器以生成适用于Google本地客户端使用的代码:https://code.google.com/p/nativeclient/
-
目前,这与mono的AOT引擎一起使用,因为本地客户端尚不支持JIT引擎。
-
-
--enable-wasm-
使用此选项将mono配置为在WebAssembly上运行。它将将主机和目标设置为WebAssembly Triplet。这覆盖了传递给
--host或--target值,而忽略了config.sub猜测。这是一种解决方法,可以使旧的汽车版本使用不认识WASM三重态。
-
使用子模型
mono引用了几个外部git子模型,例如,已更改以适用于mono运行时使用的Microsoft参考源代码的叉子。
本节介绍了如何使用它。
初始克隆应递归完成,以便所有的子模块也将在单个通过中克隆:
mono \”>
$ git clone --recursive git@github.com: mono / mono
克隆后,可以更新子模型以减少最新更改。这也可以在最初的非恢复克隆之后完成:
$ git submodule update --init --recursive
将外部更改提取到子模块中:
$ cd <submodule>
$ git pull origin <branch>
$ cd <top-level>
$ git add <submodule>
$ git commit
默认情况下,子模型被分离了,因为它们指向特定的提交。在进行更改之前,请使用git checkout移回分支:
$ cd <submodule>
$ git checkout <branch>
# work as normal; the submodule is a normal repo
$ git commit/push new changes to the repo (submodule)
$ cd <top-level>
$ git add <submodule> # this will record the new commits to the submodule
$ git commit
要切换子模块的存储库(这根本不应该是常见的事情或正常的事情),请首先编辑.gitmodules以指向新位置,然后:
$ git submodule sync -- <path of the submodule>
$ git submodule update --recursive
$ git checkout <desired new hash or branch>
所需的输出差异是.gitmodules的变化,以反映远程URL的变化,以及您看到COMIL HASH所需更改的 /位置的更改。
执照
有关Microsoft的专利授予的信息,请参阅许可信息的许可证文件和patent.txt文件。
mono商标使用政策
可以在这里找到商标和徽标的mono声道。
