在Mac上用自己编译出的DNX运行.NET程序

2024-03-17 20:10

本文主要是介绍在Mac上用自己编译出的DNX运行.NET程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DNX的全称是.NET Execution Enviroment(.NET执行环境),它是.NET跨平台的一个重要角色。如果你关注.NET的跨平台,一定要关注DNX。

由于Mono 4.0的一个bug(现已修复),目前如果要在Mac上编译dnx,需要先签出Mono的源代码进行编译,详见 Bug 29499 - System.IO.EndOfStreamException when running dnx command 。

在Mac OS X编译Mono的方法可以参考 Compiling Mono on Mac OS X 。用到的命令如下:

brew install autoconf automake libtool pkg-config
git clone https://github.com/mono/mono.git
cd mono
./autogen.sh --prefix=/usr/local --disable-nls
make
make install

编译好Mono之后(编译是一个漫长的过程),需要修改dnx中的packages/KoreBuild/build/_kpm-build.shade文件(如果没有这个文件,需要先运行一下./build.sh)

exec program='cmd' commandline='/C kpm pack${pack_options} ${projectFolder} --configuration ${configuration}' if='!IsMono'
exec program='kpm' commandline='pack${pack_options} ${projectFolder} --configuration ${configuration}' if='IsMono'

将其中的kpm改为dnu(不然编译时会报“找不到kpm”的错误,都是改名惹的祸):

exec program='cmd' commandline='/C dnu build${build_options} ${projectFolder} --configuration ${configuration}' if='!IsMono'
exec program='dnu' commandline='build${build_options} ${projectFolder} --configuration ${configuration}' if='IsMono'

然后运行./build.sh命令就可以成功编译dnx。

编译出来的东东都在artifacts/build文件夹中。其中有2个重要的文件夹:dnx-mono与dnx-coreclr-darwin-x64,前者是基于Mono的dnx,后者是基于CoreCLR的dnx,通过dnvm安装的dnx就是这个。它们包含了执行一个.NET程序所需要的一切,它们就是.NET Execution Enviroment(.NET执行环境)。

不信,我们可以用一个非常简单的.NET程序测试一下。

这个.NET测试程序叫HelloDnx,只有2个文件:

1)Program.cs

using System;public class Program
{public static void Main(){Console.WriteLine("Hello from DNX!");}
}

2)project.json

{"dependencies":{},"frameworks":{"dnx451":{},"dnxcore50":{}}
}

我们用自己编译的dnx运行这个HelloDnx试试。

首先删除以前通过dnvm安装的dnx。

cd ~/.dnx/runtimes
rm -rf *

然后用我们自己编译出的dnx中的dnu命令恢复nuget包包:

/Git/dotnet/dnx/artifacts/build/dnx-mono/bin/dnu restore
Microsoft .NET Development Utility v1.0.0-t150525235008Restoring packages for /Git/dotnet/HelloDnx/project.json
Writing lock file /Git/dotnet/HelloDnx/project.lock.json
Restore complete, 159ms elapsed

接着用我们自己编译出来的dnx运行这个HelloDnx程序。

先用基于Mono的dnx:

/Git/dotnet/dnx/artifacts/build/dnx-mono/bin/dnx . run

运行结果:

Hello from DNX!

运行成功!

接着用基于CoreCLR的dnx:

/Git/dotnet/dnx/artifacts/build/dnx-coreclr-darwin-x64/bin/dnx . run

运行结果:

Resource string id=0x17FC System.DllNotFoundException: Resource string id=0x170Bat Interop.mincore.GetStdHandle(Int32 nStdHandle)at System.Console.<>c__DisplayClass0.<get_Error>b__5()at System.Console.EnsureInitialized[T](T& field, Func`1 initializer)at dnx.host.RuntimeBootstrapper.PrintErrors(Exception ex)at dnx.host.RuntimeBootstrapper.Execute(String[] args)at DomainManager.Execute(Int32 argc, Char** argv)

运行失败。可能是少了某个程序集或者程序集版本不对,暂不去研究。基于CoreCLR的dnx目前还在开发中,出问题也正常。(这个问题的确是一个bug,详见#issue1955)

在Mac上如此折腾一下,一是可以实际体会一下.NET跨平台的进展,二是可以随时折腾dnx,改改dnx的代码,编译出来就可以用它跑.NET程序。

转载于:https://www.cnblogs.com/dudu/p/mac_dnx_build_run.html

这篇关于在Mac上用自己编译出的DNX运行.NET程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/820020

相关文章

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

在.NET项目中嵌入Python代码的实践指南

《在.NET项目中嵌入Python代码的实践指南》在现代开发中,.NET与Python的协作需求日益增长,从机器学习模型集成到科学计算,从脚本自动化到数据分析,然而,传统的解决方案(如HTTPAPI或... 目录一、CSnakes vs python.NET:为何选择 CSnakes?二、环境准备:从 Py

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据