.NET Core

编译器移植到.NET Core失败记录和对.NET未来感想

安稳与你 提交于 2020-10-04 22:52:08
.NET Core 是微软力推的新平台,影响力好像还越来越大。为了对这一行业趋势有所准备,最近把自己搞的编程语言的编译器从 .NET 移植 .NET Core ,以实现跨平台在 Linux 上运行,然而失败了。 原因是 .NET Core 类库中 AppDomain 、 AssemblyBuilder 、 ModuleBuilder 、 ILGenerator 等等缺失了一些很核心的方法或类型,导致无法编译通过。 核心缺少这些无法编译成功,也不能生成最终的二进制文件。那些以前可以在 .NET CLR 上运行的开源语言 .NET Core 对它们来说已经没有了吸引力,现在没有一个跟进到 .NET Core 上,所以也没有办法从开源项目中获得帮助。比如说 Clojure CLR ,我下载了它最新的编译器源码,它还是用 System.Reflection.Emit 命名空间生成 IL 指令。 微软要在 .NET Core 上废弃了 System.Reflection.Emit 那一套东西。我拼命研究的那套生成 IL 的知识要作废了。这让我想到了 Sliverlight 、 XNA 、 Windows Phone 的下场。我辛辛苦苦钻研到的这部分知识又被归零了,让我想到了刷卡时为零 ( 萨卡什维利外号 ) 。 我又想到现在微软现在是用 Roslyn 编译 C# 的,而且 Roslyn

跟我一起学.NetCore之依赖注入

偶尔善良 提交于 2020-10-04 04:33:34
前言 现阶段而言,依赖注入相关组件如果不会用一两个,感觉在Code的世界里肯定是落伍了,最起码得有工厂模式的思想,知道这样做的好处;提及到依赖注入,通常会关联出两个概念:Ioc(控制反转)和DI(依赖注入) 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。 百度百科 个人理解: IoC(控制反转): 就是将原先的new对象这个操作交由第三方容器,由容器统一创建对象并管理其创建对象的生命周期; DI(依赖注入): 我理解其中“依赖”有两层意思: 类与类之间的依赖关系; 对象的创建依赖于容器; "注入":不用主动从容器中获取对象,由容器根据对象依赖关系自动注入; 依赖注入:程序将对象控制权交给容器,统一依赖容器创建对象,类之间的依赖,也是通过容器自动注入; 注:注入的前提是要把对象的控制权交给容器; 依赖注入优点: 轻松管理类及类之间的依赖; 减少代码耦合性; 提高代码维护性和可扩展性; 由容器统一创建对象和管理生命周期; 好了,先不详细深究了,这里先说说

跟我一起学.NetCore之选项(Options)核心类型简介

喜夏-厌秋 提交于 2020-10-04 01:59:53
前言 .NetCore中提供的选项框架,我把其理解为配置组,主要是将服务中可供配置的项提取出来,封装成一个类型;从而服务可根据应用场景进行相关配置项的设置来满足需求,其中使用了依赖注入的形式,使得更加简单、便捷;另外和配置(Configuration)系统的无缝结合,使得服务更加灵活;而对于Options我们经常在注册服务中用到,相信只要接触过.NetCore中的小伙伴都知道,在注册服务的时候,经常在参数中进行Options的配置(如下图),可以直接的说:没有Options的服务不是好服务~~~ 正文 Options模型中主要有三个核心接口类型:IOption<TOptions>、IOptionsSnapshot<TOptions>、IOptionsMonitor<TOptions> , 这里的TOptions就是指针对服务提取出来的配置项封装的类型,以下分别看看三个核心类型定义了什么? IOption<TOptions> namespace Microsoft.Extensions.Options { // 这里TOptions 做了一个约束,必须有无参构造函数 public interface IOptions<out TOptions> where TOptions : class, new() { // 这里是通过属性的方式定义TOptions TOptions Value

面向对象存储框架:Obase快速入门

泪湿孤枕 提交于 2020-10-03 07:15:45
在项目中完成对象建模后,可以使用Obase来进行对象的管理(例如对象持久化),本篇教程将创建一个.NET Core控制台应用,来展示Obase的配置和对象的增删改查操作。本篇教程旨在指引简单入门。 本篇教程将以此对象模型展开 class Blog{ +BlogId:int[文章Id] +Url:string[文章地址] +Post:sList<Post>[文章评论] } class Post{ +PostId:int[评论Id] +Title:string[评论标题] +Content:string[评论内容] +Blog:Blog[关联文章] } Blog "1"-right-"*" Post hide empty member 从NuGet安装Obase 在VS的NuGet包管理器中添加程序包源: http://nuget.suiyiyun.cn:8081/nuget 在NuGet包管理器中选择Obase进行安装 项目搭建 打开 Visual Studio 单击“创建新项目” 选择带有 C# 标记的“控制台应用 (.NET Core)” ,然后单击“下一步” 输入“ObaseTutorial” 作为名称,然后单击“创建” 添加对freep.Obase.dll的引用 定义领域实体类 /// <summary> /// 文章 /// </summary> public class

IT技术人,“三十而已”

北慕城南 提交于 2020-10-03 04:47:37
最近电视剧《三十而已》热播,我家的电视机自然也是被霸屏,我还是跟着妹纸看了看,开头和结局完整看完,中间看了一点,大部分都是在微信公众号上通过别人的文章看完的。我个人也已经30+了,今天也和你聊聊30+这个话题。 1、关于《三十而已》 《三十而已》是由张晓波执导,张英姬编剧,江疏影、童瑶、毛晓彤领衔主演的都市情感剧。 该剧以三位三十岁女性视角展开,讲述了都市女性在三十岁这一重要年龄节点时,遭遇到多重压力的故事。 私以为,这部电视剧可能贡献了整个7~8月一半以上的话题,它描写都市女性在30岁人生节点上面临家庭、事业、爱情上的种种波折,以及她们的态度和选择,引起了社会各界广泛的共鸣,特别是办公室的吃瓜同事们。 画外音:IT、互联网公司也无一幸免,午饭时间讨论剧情的,骂渣男的,骂林有有的,此起彼伏。 对大多数人来说,可能没有哪个年龄比30岁更“动荡”。中国传统意义中“三十而立”的观念深入人心,在这个节点周围,似乎覆盖了很多人生中最重要的时刻,结婚、买房、生子,看起来每一个事件都会让刚刚独立不久的年轻人面临巨大的压力,难以平衡工作和家庭的关系,他们必须有所选择,也必然有所放弃。更重要的是,他们很焦虑! 画外音:孔子曰:“ 吾十有五而志于学 , 三十而立 , 四十而不惑 ,五十而知天命... ” 这里的立其实是指“立德、立言和立身 ” ,换句话来说就是学有所就

【翻译】.NET 5 Preview8发布

让人想犯罪 __ 提交于 2020-10-03 03:07:24
【翻译】.NET 5 Preview8发布 今天,.NET 5预览8发布了,对于.NET5.0的功能开发已经完成了,这必须要排除待处理的bug,预览8是最后一次预览版本。预计11月正式的.NET5.0版本发布之前还将发布两个正式之前的候选版本,这篇文章描述了.NET5.0版本中的一系列功能。 You can download .NET 5.0 , for Windows, macOS, and Linux: Installers and binaries Container images Snap installer Release notes Known issues GitHub issue tracker 今天同时也发布了 ASP.NET Core 和 EF Core 。 要使用.NET5我们需要最新版本的 Visual Studio (包括 Visual Studio for Mac) 才能使用 .NET 5.0. .NET 5.0包括许多改进,特别是单个文件应用程序,较小的容器映像,更强大的JsonSerializer API,一整套可空的引用类型注释以及对Windows ARM64的支持。 在NET库,GC和JIT中,性能得到了极大的提高。 ARM64是性能投资的重点,可提高吞吐量并减少二进制文件。 .NET 5.0包括新的语言版本C#9和F#5.0。 .NET 5

使用.net standard实现不同内网端口的互通(类似花生壳)

末鹿安然 提交于 2020-10-03 01:53:45
应用场景 1.公司电脑与家中电脑的 远程控制 ,一般通过teamview、向日葵等软件,端口互通后,可以使用电脑自带的远程桌面 2.家中电脑搭建 SVN、git仓库 ,在外网或者内网访问,一般使用云服务器,端口互通后,可以部署在任意电脑 3.家中电脑搭建 数据库 、 web服务 以及 其他基于TCP协议的服务 ,端口互通后,可以部署在任意电脑 注意:并不是说就不需要购买云服务器了,而是运行的服务可以部署在任意电脑,云服务器仍是必须的,但是可以买最便宜的服务器以达到省钱的目的 技术原理 模式一 服务器中转:   场景:我们有电脑A和电脑B,他们在不同的局域网,现在我们需要在电脑A访问电脑B的web服务(端口是80)   原理:我们通过监听电脑A的端口80,当此端口接收到http请求的时候,程序将通过一些操作,在电脑A、服务器以及电脑B中建立一条专用TCP链接,然后电脑A将80端口接收到的数据转发到服务器中,然后服务器再把数据发送给电脑B的80端口,从而实现访问电脑B的web服务的目的。 模式二 直接连接:   场景:我们有电脑A和电脑B,他们在不同的局域网,现在我们需要在电脑A访问电脑B的web服务(端口是80)   原理:我们通过监听电脑A的端80,当此端口接收到http请求的时候,程序将通过一些操作,在电脑A与电脑B中建立一条直连的TCP连接

.NET 5.0 RC1 发布,离正式版发布仅剩两个版本,与 netty 相比更具竞争力

不想你离开。 提交于 2020-10-02 21:09:36
原文:http://dwz.win/Qf8 作者:Richard 翻译:精致码农-王亮 说明: 1. 本译文并不是完全逐句翻译的,存在部分语句我实在不知道如何翻译或组织就根据个人理解用自己的话表述了。 2. 本文有不少超链接,由于微信公众号和头条平台外链会被剔除 URL 地址,所以原来本是超链接的内容会显示为纯文本,如果你需要这些信息你可以移步到我的 知乎 和 博客园 阅读(搜索精致码农可找到我)。 今天我们发布了 .NET 5.0 Release Candidate 1 (RC1)。它是目前最接近 .NET 5.0 的一个版本,也是在 11 月正式发布之前的两个 RC 版本中的第一个 RC 版本。RC1 是一个“上线”版本,表示你可以在生产环境中使用它了。 与此同时,我们一直在寻找最终正式版发布之前应该被修复的任何关键错误报告。我们需要你的反馈来帮助我们一起跨越 .NET 5.0 正式发布这道胜利的终点线。 我们今天也发布了 ASP.NET Core 和 EF Core 的 RC1 版本。 你可以下载适用于 Windows、macOS 和 Linux 的 .NET 5.0 版本: 安装程序和二进制包 容器镜像 快速安装程序 发布说明 已知问题 GitHub Issue 跟踪 你需要最新的预览版 Visual Studio (包括 Visual Studio for Mac)

.net core grpc单元测试

妖精的绣舞 提交于 2020-10-02 11:26:47
前言 gRPC凭借其严谨的接口定义、高效的传输效率、多样的调用方式等优点,在微服务开发方面占据了一席之地。dotnet core正式支持gRPC也有一段时间了,官方文档也对如何使用gRPC进行了比较详细的说明,但是关于如何对gRPC的服务器和客户端进行单元测试,却没有描述。经过查阅官方代码,找到了一些解决方法,总结在此,供大家参考。 本文重点介绍gRPC服务器端代码的单元测试,包括普通调用、服务器端流、客户端流等调用方式的单元测试,另外,引入sqlite的内存数据库模式,对数据库相关操作进行测试。 准备gRPC服务端项目 使用dotnet new grpc命令创建一个gRPC服务器项目。 修改protos/greeter.proto, 添加两个接口方法: // 服务器流 rpc SayHellos (HelloRequest) returns (stream HelloReply); // 客户端流 rpc Sum (stream HelloRequest) returns (HelloReply); 在GreeterService中添加方法的实现: using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Grpc.Core;

.Net core webapi的常用Test方法

大兔子大兔子 提交于 2020-10-02 10:51:57
第一种:使用ServicProviderHelper类,配置appsetting.json配置及依赖的服务 ServiceProviderHelper类,创建静态的ServiceProvider依赖注入服务器 public class ServiceProviderHelper { private static ServiceProvider _serviceProvider { get ; set ; } public static ServiceProvider ServiceProvider { get { if (_serviceProvider == null ) { IConfiguration Configuration = new ConfigurationBuilder() .SetBasePath(AppContext.BaseDirectory) .AddJsonFile( " appsettings.json " ) .Build(); // IConfiguration Configuration = new ConfigurationBuilder().SetBasePath("appsettings.json").Build(); var services = new ServiceCollection(); services.AddMvc(