其他笔记 - 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