其他笔记 - Mono for Windows 跨平台 Runtime 在Win10上编译和安装

由于.NET平台支持多种语言,而微软为了解决不同语言之间数据类型兼容问题,在CLR中提供了MSIL机制(微软中间语言),不论是哪种语言,它们的数据类型都会被转化为中间语言。
*
其次,程序员们会发现,在.NET应用程序(WinForm,ASP.NET)第一次运行的时候会比较慢,这是因为在CLR中存在一个名为JIT的工具(Just
In Time Compiler,即时编译器),JIT会将中间语言编译为对应平台的本地代码,以提高运行速度。
*
通过上面的分析,我们可以发现,想让.NET能跨平台,取决于JIT是否能够将MSIL解释成对应平台的本地代码,即:不同的平台需要安装不同的CLR。虽然,.NET可以跨平台的概念是由MS提出来的,但是MS只提供了一个Windows的实现,即:CLR,其实平台的CLR产品MS并没有开发。
*
因此,所谓的MONO其实就是第三方开发的,功能等同于CLR的一个.NET RunTime,MONO提供了不同平台的JIT实现。

在Windows上编译Mono


在Windows上编译Mono需要按照Cygwin。您还需要Visual Studio 2015或Visual Studio 2015 Build Tools 来进行命令行生成。当然,Visual Studio 2017也同样支持上述操作。

注意,以下说明适用于Cygwin。如果使用WSL(Windows Subsystem for Linux,适用于Linux的Windows子系统)代替Cygwin,则需要将相应的软件包安装到WSL环境中。

在Cygwin或WSL环境中,无需任何先决条件就可以使用Visual Studio构建Mono运行时和BCL,有关详细信息,请参见在不使用Cygwin或WSL的情况下构建Mono。

注意,要完整构建和执行测试,仍然需要如下所述的Cygwin环境。

安装环境


  • 在Windows 10设置应用中启用开发者模式:搜索检查更新,选项卡【更新和安全】>【开发者模式】
    在这里插入图片描述

  • 下载按照64位Cygwin

  • 安装Visual Studio 2015或更高版本 ,也可以下载Community Edition。

  • 下载并安装Windows版Mono,也可以按照以下说明使用或monolite进行构建:
    在cmd.exe中运行以下命令以安装Cygwin和依赖包:

setup-x86_64.exe -P autoconf,automake,bison,gcc-core,gcc-g++,mingw64-i686-runtime,mingw64-i686-binutils,mingw64-i686-gcc-core,mingw64-i686-gcc-g++,mingw64-i686-pthreads,mingw64-i686-w32api,mingw64-x86_64-runtime,mingw64-x86_64-binutils,mingw64-x86_64-gcc-core,mingw64-x86_64-gcc-g++,mingw64-x86_64-pthreads,mingw64-x86_64-w32api,libtool,make,python,gettext-devel,gettext,intltool,libiconv,pkg-config,git,curl,wget,libxslt,bc,patch,cmake,perl,yasm,unzip

确保已经配置好GIT,避免行尾出现问题:

git config --global core.autocrlf input

下载Mono源码


第一步是直接从GitHub仓库下载Mono源码,PREFIX您是Mono的安装位置(有关详细信息,请参见下文):

export PREFIX=[mono installation location]
export PATH=$PREFIX/bin:$PATH
git clone https://github.com/mono/mono.git
cd mono

预配置编译安装说明


根据预配置的构建说明,设置默认的Visual Studio Mono runtime,mingw Mono runtime和Mono
BCL,并安装到PREFIX路径中。有关进一步详细的构建配置和说明,请参阅下一节。完成以上部分中的所有步骤后,从Cygwin命令提示符运行以下命令集之一。

64位Mono Runtime:

./autogen.sh --prefix=$PREFIX --host=x86_64-w64-mingw32 --enable-msvc --disable-boehm
make -j4
make install

32位Mono Runtime:

./autogen.sh --prefix=$PREFIX --host=i686-w64-mingw32 --enable-msvc --disable-boehm
make -j4
make install

以上都使用 SGEN GC 和 default BCL profile (net_4_x)。

详细的编译说明


如果上述任意一组预配置的构建说明与需求配置不符,则本节将概述详细的逐步安装说明。
安装时将使用现存的Mono发行版所在的路径(PREFIX),但在编译完后会被替换掉。注意,如果想保持现有的Mono发行版本不变,请把将要安装新版本的路径(PREFIX)另行设置。

可以仅配置路径为指向现有Mono发行版,而无需指定PREFIX,然后make install将内部版本安装到默认位置。

另一种选择是在没有现有预装Mono发行版的情况下进行构建,有关monolite更多详细信息,请参阅参考资料部分,或描述如何在MONO_EXECUTABLE环境变量中使用Visual Studio build Mono运行时作为编译的一部分。

以下配置步骤显示了受支持的不同Mono构建配置。

  • 使用SGEN GC和默认BCL配置文件(net_4_x)编译的64位Mono Runtime(Boehm GC在64位Windows版本上不受支持):
./autogen.sh --prefix=$PREFIX --host=x86_64-w64-mingw32 --disable-boehm
  • 使用SGEN GC和默认BCL配置文件(net_4_x)编译的32位Mono Runtime
./autogen.sh --prefix=$PREFIX --host=i686-w64-mingw32 --disable-boehm
  • 使用Boehm GC和默认BCL配置文件(net_4_x)的32位Mono Runtime
./autogen.sh --prefix=$PREFIX --host=i686-w64-mingw32

注意,32位Mono运行时支持SGEN和Boehm GC。Boehm
GC由于遗留原因仍然可用,但在64位Windows构建中不支持。建议将SGEN GC用于32位和64位Windows版本。

启用BTLS作为Windows构建的加密后端

Windows上的Mono支持BTLS库作为SSL / TLS的备用加密后端。它不是默认的替代方法,必须启用它才能构建并由Mono运行时使用。要启用BTLS,请输入–enable-btls回到autogen.sh上面的步骤。

BTLS编译将为Visual
Studio编译添加一些其他先决条件。获取其他所需软件包的最简单方法是安装并使用Chocolatey软件包管理器。有关如何将Chocolatey软件包管理器安装到构建系统中的说明,请参阅这里

安装Chocolatey之后,将以下软件包添加到构建系统:

choco install cmake

作为可选选项,为在构建BTLS使用汇编程序优化,需要安装其他软件包。在没有这些软件包的情况下,仍然可以使用Visual Studio作为cmake构建生成器进行构建,但是该配置将无法构建汇编程序优化的加密功能。

choco install activeperl
choco install ninja
choco install yasm

确保它们对于Visual Studio使用的构建环境都是可见的(重新启动构建中使用的任何命令提示符或Visual Studio IDE)。

为Windows版本启用LLVM

Windows上的Mono以几种不同的构建组合支持LLVM。在Windows交叉编译器构建时,host为Win32 但目标平台并非Win32,则可以使用标准LLVM构建指令。(host == Win32 but target != Win32

对于常规Windows构建,主机与目标平台一致时(host == Win32 target = Win32),只有64位 Visual Studio构建支持LLVM。要启用LLVM,请用
--enable-llvm转到autogen.sh上面的步骤。

Windows构建支持除之外的大多数LLVM配置标志–enable-loadedllvm。如果使用进行配置–with-llvm,则Visual Studio构建将使用所指向的预构建LLVM版本,llvm-config.exe而不是将内部LLVM版本构建为Visual Studio构建的一部分。

注意,由于只有64位 Visual Studio版本支持常规Windows版本的LLVM,因此将在autogen.sh输出中生成一条警告,指示mingw版本禁用LLVM。从Visual Studio(使用Win32构建配置)构建不受支持的构建配置时,也会生成类似的警告。

还有两个MSBuild属性可以直接控制Visual Studio版本中LLVM的使用(以防autogen.sh不使用或需要被覆盖)。

MONO_ENABLE_LLVM

设置为true时,启用Visual Studio LLVM构建。可以显式传递给MSBuild或进行设置mono.props以强制LLVM构建。

MONO_EXTERNAL_LLVM_CONFIG

当设置为指向的预构建版本的路径时llvm-config.exe,将使用指定的LLVM构建,而不是作为常规Visual Studio Mono运行时构建的一部分进行本地内部LLVM构建。可以显式传递给MSBuild或进行设置mono.props以强制LLVM构建。

其他先决条件仅在将LLVM作为Visual Studio Mono运行时构建的一部分进行构建时适用。如果使用–with-llvm配置选项或MONO_EXTERNAL_LLVM_CONFIG MSBuild属性,则不需要其他先决条件。

LLVM构建将为Visual Studio构建添加几个其他先决条件。获取其他所需软件包的最简单方法是安装并使用Chocolatey软件包管理器。有关如何将Chocolatey软件包管理器安装到构建系统中的说明,请参阅这里

安装Chocolatey之后,将以下软件包添加到构建系统:

choco install cmake
choco install python2

可选,默认情况下,LLVM构建会将Visual Studio用作cmake构建生成器。构建也支持忍者作为cmake构建生成器。为了使用忍者,将以下软件包安装到构建系统:

choco install ninja

确保它们对于Visual Studio使用的构建环境都是可见的(重新启动构建中使用的任何命令提示符或Visual Studio IDE)。

使用monolite代替预装的Mono发行版

如果没有Mono发行版,则可以使用进行构建monolite。在运行之前,只需运行以下命令make:

make get-monolite-latest

使用 Visual Studio 安装 Mono

可以使用Visual Studio和msbuild构建本机运行时库。但是,.NET库和测试当前必须使用在Cygwin中构建make。下面的步骤描述了在类库和测试以及在Cygwin中运行测试套件时,如何在Visual Studio中构建运行时库以及如何使用Visual Studio构建的Mono可执行文件。

  • 使用Visual Studio生成64位Mono
    msvc\mono.sln在Visual Studio IDE中打开Mono解决方案。使用Release和x64平台配置重建解决方案。有关命令行构建,请参见下文。

  • 使用Visual Studio构建32位Mono
    msvc\mono.sln在Visual Studio IDE中打开Mono解决方案。使用Release和Win32平台配置重建解决方案。有关命令行构建,请参见下文。

  • 从Visual Studio命令行构建Mono
    可以从命令行msbuild.exe直接运行,而不是从Visual Studio IDE中进行构建。建议从Visual Studio开发人员命令提示符运行构建,以获取正确设置的构建环境。

对于Visual Studio 2015:
"%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\Common7\Tools\VsDevCmd.bat"从构建中使用的命令提示符运行,或从开始菜单(如果已安装)使用“ VS2015的开发人员命令提示符”启动新命令提示符。

对于Visual Studio 2017:"%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat"在生成时使用的命令提示符下运行,或从开始菜单(如果已安装)使用“ Developer Command Prompt for VS2017”启动新命令提示符。

注意,安装的Visual Studio文件的路径可能会有所不同,具体取决于安装位置和Visual Studio版本。

使用SGEN GC的Visual Studio 2015 32位Mono运行时发行版示例:

msbuild.exe /p:PlatformToolset=v140 /p:Platform=Win32 /p:Configuration=Release /p:MONO_TARGET_GC=sgen msvc/mono.sln

使用SGEN GC的Visual Studio 2015 64位Mono运行时发行版本的示例:

msbuild.exe /p:PlatformToolset=v140 /p:Platform=x64 /p:Configuration=Release /p:MONO_TARGET_GC=sgen msvc/mono.sln

使用SGEN GC的Visual Studio 2017 32位Mono运行时发行版示例:

msbuild.exe /p:PlatformToolset=v141 /p:Platform=Win32 /p:Configuration=Release /p:MONO_TARGET_GC=sgen msvc/mono.sln

使用sgen GC的Visual Studio 2017 64位Mono运行时发行版示例:

msbuild.exe /p:PlatformToolset=v141 /p:Platform=x64 /p:Configuration=Release /p:MONO_TARGET_GC=sgen msvc/mono.sln

还有一个可用于msbuild.exe从Visual Studio构建环境运行的构建脚本msvc\run-msbuild.bat。该脚本根据VisualStudioVersion环境变量选择Visual Studio版本工具链。

对于Visual Studio 2015 64位Mono Runtime构建:
set VisualStudioVersion=14.0
msvc\run-msbuild.bat "/p:Configuration=Release /p:Platform:x64 /p:MONO_TARGET_GC=sgen /t:Build"
对于Visual Studio 2017 64位Mono Runtime构建:
set VisualStudioVersion=15.0
msvc\run-msbuild.bat "/p:Configuration=Release /p:Platform=x64 /p:MONO_TARGET_GC=sgen /t:Build"

注意,虽然可以msbuild.exe从Cygwin环境运行,但不建议这样做,因为该构建可能会从Cygwin而非Windows环境中获取构建工具和依赖项。但是msvc/run-msbuild.sh,可以从Cygwin调用一个构建脚本,该脚本将尝试在运行之前设置原始Windows环境msbuild.exe

Visual Studio MSBuild构建属性

与常规autogen.sh配置步骤相比,使用Visual Studio构建Mono运行时提供了许多其他选项。这些属性可以显式传递到MBuild或在mono.props属性文件中设置,由Mono Visual Studio构建读取。
*
也可以通过“属性管理器”,“视图”->“其他Windows”->“属性管理器”在Visual Studio IDE中更改属性值,在Mono项目下打开Mono属性表(任何配置都可以),然后选择“公共属性”->“用户宏”。更改值后,请选择“确定”,所有Visual Studio构建配置应相应更新。如果mono.props在Visual Studio中加载解决方案时直接在中更改了属性值,则在重新加载解决方案之后才会进行更改。如果使用IDE的“属性管理器”对话框更改了属性值,则更改将直接应用于已加载的解决方案。

MONO_BUILD_DIR_PREFIX
建立树的位置。进行更改以启用源树外构建,例如c:\mono-build\。默认值是.\build\指构建将最终以mono-root\msvc\build
MONO_TARGET_GC
GC用于build,sgen或boehm。注意,boehm仅在32位构建配置中受支持。所有构建配置的默认值为sgen。
MONO_USE_STATIC_C_RUNTIME
使用静态c运行时链接Mono二进制文件。如果为false,则所有二进制文件和库都将使用动态c-runtime链接。默认值为false。
MONO_USE_STATIC_LIBMONO
使用静态libmono链接Mono二进制文件。如果为false,Mono二进制文件将使用动态libmono链接。默认值为false。
MONO_ENABLE_LLVM
Mono运行时将链接并包括LLVM。如果未设置MONO_EXTERNAL_LLVM_CONFIG,则这还将构建Mono LLVM存储库,作为常规Mono运行时构建的一部分。设置为false时,Mono运行时将不会链接并包含llvm库。默认值为false。

注意,也可以使用,通过标准配置来设置此选项--enable-llvm
MONO_EXTERNAL_LLVM_CONFIG
使用外部预构建LLVM库而不是内部构建。注意,这需要设置MONO_ENABLE_LLVM否则将无效。默认值为空。

注意,也可以使用,通过标准配置来设置此选项--with-llvm=full-path-to-llvm-config.exe
MONO_ENABLE_BTLS
Mono运行时将链接并包含BTLS。将此值设置为true还将作为常规Mono运行时构建的一部分构建Mono BTLS存储库。设置为false时,Mono运行时将不会链接并包含BTLS。默认值为false。

注意,由于BTLS支持是BCL构建的一部分,因此在进行Mono运行时构建时仅进行设置将不会在BCL构建中包括所需的BTLS支持。建议将其–enable-btls用作配置步骤的一部分,因为这将确保BCL和Mono运行时构建中都包含BTLS支持。

配置make为使用Visual Studio构建Mono运行时

为了使在构建BCL和测试时使用Visual Studio构建Mono运行时,请将MONO_EXECUTABLE环境变量设置为Visual Studio构建Mono运行时。切换到先前使用的Cygwin Shell并运行:

export MONO_EXECUTABLE=/cygdrive/c/mono-source-location/msvc/build/sgen/x64/bin/Release/mono-sgen.exe

注意,以上路径将根据源位置,构建位置,32/64位构建配置和使用的GC而变化。上面的示例为配置为使用SGEN
GC的64位发行版Mono运行时使用默认的构建位置。

构建Mono mingw运行时,BCL和测试
切换到先前使用的Cygwin Shell并运行:

make -j4

注意,即使已经构建和配置了Visual
Studio构建Mono运行时,仍将构建mingw构建Mono运行时。但是,由于MONO_EXECUTABLE已配置,mingw运行时将不会用作BCL或测试版本的一部分。

已知问题:“未能创建符号链接”
如果make V=1成功运行BCL之后运行并看到此消息:

make[8]: Entering directory '/home/user/work/mono/mcs/class/corlib'
CYGWIN=winsymlinks:nativestrict ln -s /home/user/work/mono/mcs/class/lib/build-win32 /home/user/work/mono/mcs/class/lib/build
ln: failed to create symbolic link '/home/user/work/mono/mcs/class/lib/build': Operation not permitted
make[8]: *** [../../build/library.make:336: ../../class/lib/build/.stamp] Error 1

您需要Developer Mode在Windows 10设置应用程序(更新和安全性->对于开发人员选项卡)中启用该功能,该应用程序将允许您的用户创建没有管理员权限的符号链接。

如果您使用Windows的早期版本,则需要以管理员身份运行该版本。

运行测试

确保MONO_EXECUTABLE已设置为使用Visual Studio build Mono运行时,请参见上面的说明。为了运行和通过所有测试,Cygwin外壳将需要提升的权限。如果没有其他权限,将确定一些测试失败。

make check

安装

make install

参考:

compiling-mono/windows

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值