.netcore_.netcore 一段时间后崩溃无法访问 - CSDN
精华内容
参与话题
  • 为什么选择.NETCore?

    万次阅读 2018-02-06 18:17:08
    为什么选择.NETCore? ...您需要学习如何在新框架中编写,构建,测试,部署和维护应用程序。作为开发人员,有许多框架可供选择,很难知道什么是最适合的。...为了理解为什么.NET Core值得一看,这有助于知道

    为什么选择.NETCore?

     为什么选择.NETCore?

     

    学习新的开发框架是一项巨大的投资。您需要学习如何在新框架中编写,构建,测试,部署和维护应用程序。作为开发人员,有许多框架可供选择,很难知道什么是最适合的。即使您正在使用.NET开发软件,.NET Core也不相同,您需要花时间学习使用它的工具和技术。为了理解为什么.NET Core值得一看,这有助于知道你从哪里开始。

    .NETCore的开源协议

    .NET Core从属于.NET基金会,由微软进行官方支持。使用最宽松的MIT和Apache 2开源协议,文档协议遵循CC-BY。这将允许任何人任何组织和企业任意处置,包括使用,复制,修改,合并,发表,分发,再授权,或者销售。唯一的限制是,软件中必须包含上述版 权和许可提示,后者协议将会除了为用户提供版权许可之外,还有专利许可,并且授权是免费,无排他性的(任何个人和企业都能获得授权)并且永久不可撤销,相较于oracle对java和mysql的开源协议微软做出了最大的诚意

    如果您是.NET Framework开发人员

    .NET Core是为了重新启动某些Framework组件而为其他人提供跨平台工作的机会。由于.NET Framework主要以托管(C#)代码为基础构建,因此这些部分不需要更改代码即可移至.NET Core。依赖于Windows特定组件的库必须被移除或重构以使用跨平台替代方案。这同样适用于您的应用程序。

    您的.NET应用程序可以是跨平台的

    您现有的.NET Framework应用程序可以在其他操作系统上工作。对于希望扩大类库的受众平台,或者希望在分布式应用程序的其他领域使用相同代码的开发人员来说,这是非常好的选择。即使你想用你亮瞎眼的MacBook上开发.NET,而无需双启动到Windows。

    并不是所有的框架都被移植到.NET Core,但主要的部分。存在一些API差异。例如,如果您使用了大量的反射,则可能需要重构代码才能使用Core。有关更多信息,请看文章末尾的的两者差异部分。

    ASP.NETCore胜过框架ASP.NET

    ASP.NET Core和ASP.NET之间的性能差异是几个数量级大部分的ASP.NET被传统的System.Web库所限制。.NET Framework支持旧版本的ASP.NET项目,而且这个约束限制了ASP.NET的发展。微软决定重写整个架构。这意味着打破变化,但结果是值得的。

    .NETCore是创新的焦点

    向后兼容性是一把双刃剑。这意味着您的应用程序可以继续得到新版本框架的支持,确保在新版本框架中所做的更改不会破坏现有的应用程序。

    所有的努力避免变化都限制了框架的创新。框架的变化需要彻底的理由(通常来自客户),详尽的测试以及来自多个层次产品组的批准。

    使用.NET Core,团队可以更容易专注的在.net core上工作。比如核心类库(如System.Collections)的更改仍然需要与.NET Framework相同的活力,但是ASP.NET Core或Entity Framework Core可以更轻松地进行实质性更改,而不受向后兼容性的限制。这允许更大的创新。

    .NET Framework作为一个整体产品发布,但是.NETCore被分解成多个部分。现在开发人员可以选择使用哪个版本的库。只要它在.NET标准库之外,.NET Core团队就可以用较少的难度进行创新这就是为什么在将来你只能看到错误修复的框架; .net core将获得所有新功能。

    发布周期更快

    如果您曾在框架中遇到错误,并将其报告给Microsoft,则您将知道发布修复需要多长时间。这个框架有很长的发布周期,通常至少要测量一年,而且在这些周期中还有很小的窗口用于特性工作。每个代码更改都可能会导致框架中其他位置出现意外的问题。为了给每个团队足够的时间来测试框架,有很多时候代码更改是受限制的或者严格审查的。如果您在.NET中发现了一个错误,最好找到一个解决方法,而不是等待更新(这也是.NETCore开源带来的好处,您不需要完全依赖微软支持才能解决问题,这对于大型企业更是有利,可以利用技术资源来对.NETCore进行本企业定制化,成为.NETCore的分支来运行)

    .NET Core遵循更快的发布步调。开发人员可以使用夜间构建来尽早测试。不属于.NET标准库的库可以按自己的步调发布。因为所有东西都是开源的,如果微软没有足够快的响应,任何开发者都可以提出修补。如果解决方法不被接受,讨论就会公开进行,所有人都可以看到为什么做出这个决定


    如果你是.NET新手

    在Windows平台上,.NET框架没有太多的竞争。微软可以对从操作系统内核层到高级.NET库的所有内容进行更改。通过将.NET引入其他平台,竞争环境发生了变化。.NET现在必须与其他所有的开发框架竞争。

    C#是一个了不起的语言

    .NET的旗舰语言C#具有许多独特的功能,例如语言集成查询和异步构造,这使得它强大且易于使用。相较于保守的java(我们也看到Oracle旗下的老牌java已经已经越来越难推出新特性,这是历史包袱所导致,在将来模块化的开发中很难进行更新维护)C#也在不断创新。C#团队公开设计语言,因为他们希望任何人提出建议或参与讨论。编译器(Roslyn)完全是模块化和可扩展的

    ASP.NET Core性能与顶级Web平台相当

    如果您正在编写Web应用程序或服务,那么ASP.NET Core是一个很好的搭建平台。它具有出色的性能和低内存占用。许多功能可以使您的应用程序更容易开发和维护。

    .NET Core不是从头开始的

    .NET在2000年以前就已经出现了。框架代码在过去几年中已经得到了巩固,开发人员也从中受益。已经被移植到Core的大部分Framework代码都没有改变。这使.NET Core在构建应用程序的可靠框架方面领先一步.NET Core也完全由Microsoft支持还有越来越活跃的开源社区例如红帽组织这降低了为您的应用程序使用Core的风险。


    什么是.NETCore?

    为了理解.NET Core,它有助于理解.NET Framework。微软在21世纪初发布了.NET Framework。.NET Framework是一个仅限于Windows的开发框架,它在最底层提供了内存管理,安全性,异常处理和许多其他功能。.NET框架附带一大堆库,可执行从XML解析到HTTP请求的各种功能。它还支持几种语言,并将它们编译成相同的通用中间语言; 任何语言都可以使用任何其他语言构建的库。这些关键概念也出现在.NET Core中。

    2016年,微软收购了Xamarin并发布了.NET Core 1.0。之前Xamarin已经移植了.NET框架的大部分内容来运行在基于Linux / Unix的操作系统上。一些代码可以在.NET Framework,Xamarin和新的.NET Core之间共享,但编译后的二进制文件不能。.NET Core的一部分努力是创建一个标准化的平台,允许所有.NET实现共享相同的库。


                              metzgar_whynetcore_01

    图1 .NET框架,.NET Core和Xamarin都共享一个称为.NET标准库的标准化平台


    以前的Xamarin和.NET Framework之间是无法共享二进制文件的。随着.NET标准库和通用基础架构的推出,这两个框架现在成为统一的.NET生态系统的一部分。

    什么是.NETCore?在上图中,似乎.NET Core是另一个包含UWP(通用Windows平台)和ASP.NET Core的框架。为了使.NET Core成为现实,创建了.NET标准库和通用基础架构。


    .NETCore的关键功能

    .NET Core借鉴了.NET Framework的最佳实践,并将软件工程的最新进展结合在一起。这些是.NET Core的一些显着特征。

    扩大您类库的覆盖面

    使用.NET Core,您可以使用.NET标准库编写应用程序或库。

    然后它可以在许多平台上共享。


    metzgar_whynetcore_02

    图2 .NETCore开发


    同一个库可以在后台服务“本地”或云中运行,也可以在手机,平板电脑或桌面上运行的客户端应用程序中运行。与其为iOS,Android和Windows构建单独的应用程序,您可以构建一个适用于所有平台的应用程序。.NET Core是小型和完美的容器,可以轻松扩展并缩短开发时间。

    .NET Core和.NET Standard Library建立了一个通用平台。过去,当新版本的操作系统或新设备出现时,开发人员有责任重新构建新平台的应用程序或库,并分发更新。使用.NET Core,不需要重建和重新分配。只要新的平台支持你所有的依赖库,它就支持你的应用程序。

    在任何平台上简单部署

    Microsoft产品往往具有复杂的安装过程。COM组件,注册表项,特殊文件夹,GAC - 都是为了利用Windows的特性而设计的。.NET框架依赖于这些构造,这使得它不适合其他操作系统。

    在发布依赖于.NET Framework的应用程序时,安装程​​序必须足够聪明才能检测是否安装了错误的.NET Framework版本,并为用户提供正确的方法。大多数现代Windows版本都包含.NET Framework。这使得某些应用程序更容易安装,但是如果应用程序使用默认情况下未安装的功能(如ASP.NET与IIS或WCF组件的集成),则可能会导致复杂的问题。

    另一个复杂的问题来自补丁。包括错误修复或安全更新的修补程序可以通过Windows更新或通过Microsoft下载中心分发给客户。您测试应用程序的.NET Framework可能与客户使用的补丁程序不同。当您假定.NET Framework对于所有客户都是一样的时候,通常很难确定在应用程序中导致奇怪行为的原因。

    .NET Core的模块化设计意味着您只包含所需的依赖关系。所有这些依赖关系与您的应用程序进入相同的文件夹。部署应用程序与复制文件夹一样简单。这种方法的另一个优点是可以有多个版本并行运行。这个策略对于使所有平台的部署体验保持一致至关重要。

    云和容器

    在云系统中,用更少的硬件为更高密度的用户提供服务是非常重要的。应用程序的占位面积越小,密度越高。虚拟机已经在云端普遍存在多年,但是它们有几个问题:

    • 大小 - 一个典型的虚拟机文件是千兆字节,如果不是几十千兆字节。这使得它们跨网络传输非常耗时,并且对磁盘空间有很大的要求。
    • 启动时间 - 启动虚拟机意味着启动操作系统。对于Windows来说,这是一个挑战,因为启动新机器需要花费时间。这可以使处理突发交通困难。
    • 内存 - 虚拟机需要将整个操作系统与应用程序一起加载到内存中。这意味着很多主机的内存被浪费了。
    • 不一致性 - 相同的虚拟机可以复制到多个主机,主机必须提供相同的虚拟化硬件,这可能依赖于物理硬件。无法保证虚拟机在任何给定的主机上运行相同的操作。

    容器通过虚拟化操作系统来解决虚拟机的问题。容器只包含应用程序及其依赖项。文件大小要小很多倍,启动时间以秒为单位,只有应用程序加载到内存中,容器保证在任何主机上工作。

    内置于Windows的.NET Framework不能在容器上运行。鉴于容器的明显优势,.NET Core的设计决定之一就是使其成为模块化这意味着你的.NETCore应用程序可以被“发布”,使得它和它的所有依赖关系在一个地方,这很容易放入容器

    ASP.NET性能

    如果您不熟悉ASP.NET,则是.NET Framework中内置的Web应用程序平台。ASP.NET被许多有影响力的组织所使用,包括Stack Overflow还有绝大多数的可靠性很高的金融证券行业领域ASP.NET是2002年发布的第一个.NET Framework版本,并不断发展。尽管ASP.NET取得了成功,但在ASP.NET团队中却感觉到他们正在失去开发人员,因为ASP.NET的性能没有竞争力,只能在Windows平台上运行。

    一家名为TechEmpower的公司每隔几个月就会运行一次Web应用程序平台的基准测试,并提供一个分为几类的排名。基准测试在Linux上运行,仅包含Windows平台。对于ASP.NET团队来说,这很麻烦。许多平台都用于编写跨平台的Web应用程序,并且其性能数据令人印象深刻。此外,一些Java框架发布了天文数字,例如每秒570万个明文请求,或者490万个。


    metzgar_whynetcore_03

    图3  TechEmpower基准,第12轮


    在TechEmpower基准测试的第十一轮中,Mono平台上的ASP.NET MVC被纳入测试。结果不好。Mono上的ASP.NET每秒产生一个微小的2000个明文请求。Mono不是由Microsoft创建的,它不会像普通的.NET Framework那样得到相同数量的性能调整。为了获得更公平的比较,ASP.NET团队决定在与TechEmpower相同的硬件上运行.NET 4.6的基准测试。结果是每秒约50,000个请求。仍然没有接近NodeJS(每秒320,000个请求),或TechEmpower列表上的其他任何顶级框架。

    可怜的低分并不意外。如前所述,ASP.NET知道改变现状只能通过重写整个架构来清除障碍。这正是发生的事情。

    ASP.NET团队着手构建ASP.NET Core,几个月后,该团队庆祝asp.net core每秒超过100万个请求。最新asp.netcore与node.js的性能对比更是让asp.net core的性能优势继续扩大

    ASP.NET Core   VS     Node.js

    上图中可看出asp.net core作为复杂web开发的性能已经相较于之前有质的提高,  ASP.NET Core  VS  node.js

    ASP.NET Core表明了微软思维的转变。微软意识到它必须具有竞争力才能赢得开发者。它还必须在Windows以外的平台上竞争。这是创建.NET Core的原动力。

    开源

    现代软件开发人员并不满足于寻求功能。当已经有一个满足他们需求的开源项目的时候,尤其如此。当大公司热衷于开源软件时,即使是最忠实的微软开发者也会转向其他框架和库,以便在预算内按时完成自己的项目。如果微软关心“开发人员,他们必须做出改变。

    公开.NET Framework的源代码是第一步。.NET Framework源代码已经在referencesource.microsoft.com 和GitHub上公开了好几年了。


    metzgar_whynetcore_04

    图4 .NET Framework参考源


    从单独的开源代码到接受外来的贡献是完全不同的。.NET Core开发人员不仅希望获得外部贡献,还希望将社区纳入设计和开发。这导致了更多的透明度。ASP.NET Core团队每周都会在http://live.asp.net上举行一次社区直播会议.NET Core的代码从一开始就在GitHub上公开,任何人都可以提出请求。社区成员可以在GitHub中创建错误和功能。.NET Core已经标志着微软在开源方面的重大转变。


    与.NET Framework的差异

    .NET Core不仅是Linux和Mac的.NET Framework。微软并没有移植所有的.NET Framework,对于ASP.NET客户来说,ASP.NET团队是.NET Core的驱动因素。MVC,Web API和SignalR都可以在.NET Core中找到,或者在路线图上。

    框架功能没有移植到.NETCore

    我给这个列表提供了可以改变的知识。某些功能不适用于非Windows平台,其他某些功能也将不会由Microsoft在将来推出,因为有更好的替换或功能在某些方面有问题(不安全,难以维护等 )。

    • WPF / XAML - Windows Presentation Foundation仅适用于用户界面。.NET标准库不包括用户界面库,.NET Core不会提供跨平台的UI框架。这意味着像Windows窗体和系统的东西。绘图不会移植到.NET Core。
    • 事务 - 这个库使创建分布式事务变得容易。它依赖于特定于Windows的组件,使其不易移植到.NET Core。
    • AppDomains - 这些对于隔离程序集来说是非常有用的,而且不会终止进程,这对于允许插件的应用程序来说非常有用。它们依赖于某些Windows特定的构造,这些构造在其他操作系统上不起作用。
    • .NET远程处理 - 远程对象已被REST服务成功。
    • ASMX - 编写已被Web API取代的Web服务的旧方法。
    • Linq to SQL - 由实体框架取代。
    • WCF服务 - Windows Communication Foundation客户端功能在.NET Core中可用,但不能创建服务。
    • WF - Windows Workflow Foundation依赖于XAML,WCF服务以及其他.NET Framework特性之间的事务。

    .NET Framework开发人员的微妙变化

    有经验的.NET Framework开发人员可能会在.NET Core中遇到一些惊喜。编写新的代码应该是相对直接的,因为你不太可能使用像HashTableor 这样的旧的结构ArrayListVisual Studio的Intellisense也指出.NET Core是否支持类型,方法,属性等。


    metzgar_whynetcore_05

    图5 Visual Studio IntelliSense指示.NET Core中是否有类或成员可用


    NET可移植性分析器

    如果您试图将现有的.NET应用程序转换为.NET Core,那么最好的地方就是.NET可移植性分析器。它既可以作为命令行应用程序,也可以作为Visual Studio插件使用。有许多.NET平台可供选择:


    metzgar_whynetcore_06

    图6 .NET可移植性分析器中提供的目标平台


    尽可能使用此工具创建一个详细的报告,提供有用的建议:


    metzgar_whynetcore_07

    图7.NET可移植性分析器报告


    反射

    .NET Core中的反射工作方式与.NET Framework中的不同。最明显的区别是,Type类正常的许多操作不再存在。有些人已经被调到一个新的TypeInfo类其他操作在.NET标准库中不可用,并且需要额外的依赖性。

      .NET Framework实现反射

    复制代码
      .NET Framework实现反射
    
    PropertyInfo targetProperty = null;
    foreach (var property in
             owningElement.GetType().GetProperties())
    {
        if (property.Name == this.Name
            && property.PropertyType.IsGenericType)
        {
    复制代码
    
    

    The .NET Core 实现反射.

    复制代码
    PropertyInfo targetProperty = null;
    foreach (var property in
    owningElement.GetType().GetProperties()) 
    {
    if (property.Name == this.Name && property.PropertyType
    .GetTypeInfo().IsGenericType)           
    {
    复制代码
    
    

    ❶需要依赖于System.Reflection.TypeExtensions

    ❷ 许多类型操作移到了TypeInfo


    概要

    软件开发行业正在不断发展。从语言到框架,工具到方法论,一切都受到挑战和改进。.NET框架已经到了不得不做出改变的时候,以跟上竞争对手。.NETCore是.NET演进过程中必不可少的一步。它将最好的.NET Framework与现代软件开发中使用的实践相结合。诸如可移植性,简单部署,高性能,开放源代码和强大支持等特性使其值得一试。

    Why Choose .NET Core?

    展开全文
  • .NET Core全面扫盲贴

    千次阅读 2018-08-28 17:26:57
    转自:https://www.cnblogs.com/Wddpct/p/5694596.html 1. 前言 2. .NET Core 简介 2.1 .NET Core是什么 2.2 .NET Core的组成 2.3 .NET Core的特性 2.4 开发语言 3.... 3.1.1 安装.NET Core SDK和.NET C...

    转自:https://www.cnblogs.com/Wddpct/p/5694596.html

     

    1. 前言

    .NET发行至今已经过了十四个年头。随着版本的不断迭代更新,.NET在Windows平台上的表现也是越来越好,可以说Windows平台上所有的应用类型.NET几乎都能完成。

    只是成也Windows,败也Windows,这十四年来,除了部分“民间”版本,.NET一直没能在官方支持下摆脱Windows平台的局限,“开源”和“跨平台”这两个词语也是所有.NET开发者心中的痛楚。最终,.NET Core出现了,它让开发者们在官方和社区的支持走出了Windows,可以在macOS,Linux主流distributions上编写调试并部署.NET程序。

     

    2. .NET Core 简介

     

     

    2.1 .NET Core是什么

     

    .NET Core是一个开源通用的开发框架,支持跨平台,即支持在Window,macOS,Linux等系统上的开发和部署,并且可以在硬件设备,云服务,和嵌入式/物联网方案中进行使用。.NET Core的源码放在GitHub上,由微软官方和社区共同支持。

    它和传统的.NET Framework,属于“子集—超集”的关系,或者你也可以简单地认为它就是.NET Framework的跨平台版本(基于BCL的层面上看)。这是因为在当前版本中(1.0),.NET Core中的大部分核心代码都是从.NET Framework中继承重写的,包括Runtime和Libraries(如GC, JIT, 部分类型)。

    吐槽:只能感谢微软《CLR via C#》不用白看呀,我之前看了得有小半年才看完

    现在的.NET Core 1.0版本是一个很小的核心,APIs和工具也并不完整,但是随着.Net Core的不断完善,补充的Apis和创新也会一起整合到.NET Framework中。也就是说,.NET Core微软会同时更新.NET Framework和.NET Core,他们就像俩兄弟,共同努力致富(致谁的富?当然是.NET开发者们),实现所谓的天下大同,也就是.NET 标准2.0

    这里不得不提到一个叫做.NET Standard Library概念。作为.NET平台APIs开发官方支持标准,它要求所有的.NET框架APIs都遵循向下兼容。比如说.NET Framwork 4.6支持.NET Standard Library 1.3,.NET Framwork 4.6.2框架支持.NET Standard Library 1.5,而.NET Core 1.0框架支持1.6标准。

    最终展望如下:

     

    2.2 .NET Core的组成

     

    • .NET Runtime
      CoreCLR。如之前所说,CoreCLR与.NET Framework的CLR并没有什么区别,进程管理,GC,JIT(RyuJIT 编译器)这些部分也都是一样的,只是针对服务器系统做了相应优化。现在CLR和CoreCLR也在进行同步更新,只是可以肯定的是,CoreCLR才是.NET的未来,CLR将作为兼容手段而存在

    • Framework Libraries,
      CoreFX。包括集合类,文件系统处理类,XML处理类,异步Task类等

    • SDK Tools 和 Language Compilers (SDK工具和编译器)
      CLI工具和Roslyn编译器。可以通过.NET Core SDK(.NET Core开发工具包)获取。

    • dotnet’app host
      用来选取并执行对应运行时,提供组件载入原则和启动.NET Core应用程序。SDK也是通过相同程序启动。

      Tips:是不是想起了MSCorEE.dll这个垫片,它同样承载着Windows平台上为.NET应用程序选择CLR版本的工作

     

    2.3 .NET Core的特性

     

    • 跨平台
      可以在Windows,macOS,Linux上运行

    • 灵活的部署机制

      1.Portable applications(便携式应用)
      这种部署机制和传统的.NET Framework相似,只要目标平台上存在.NET Core Runtime即可。

      2.Self-contained application(自宿主应用)
      顾名思义,这种部署机制将应用和运行时共同打包,即便目标平台上没有安装.NET Core Runtime也能正常使用

      第二种方式和.NET Native也是不一样的,仍然使用CoreCLR,而.NET Native使用CoreRT作为运行时,详细信息请见dotnet/corert

    • 命令行工具
      .NET程序所有的运行脚本都可以用命令行工具执行(cmd,bash)这里有几个常见的donnet命令

    指令 帮助
    dotnet new 产生新的基本 .NET 项目内容 (包含 project.json、Program.cs 以及 NuGet.config
    dotnet restore 还原所参考的 NuGet 包
    dotnet build 建造 .NET 项目
    dotnet publish 产生可发行的 .NET 项目 (包含所属的 Runtime)
    dotnet run 编译与立即运行 .NET 项目 (较适用于 exe 型项目)
    dotnet repl 引导交互式的对话
    dotnet pack 将项目的产出封装成 NuGet 包
    • 兼容性
      通过.NET Standard Library与.NET Framework,Xamarin,Mono兼容

    • 开源
      .NET Core从属于.NET基金会,由微软进行官方支持。使用MIT和Apache 2开源协议,文档协议遵循CC-BY

     

    2.4 开发语言

     

    .NET Core 1.0版本中支持的编程语言仅有C#(F#和VB暂未实现),这里还要提到一个开源的语言编译器Roslyn,它负责将代码编译成我们熟悉的IL语言,然后再借由AOT或JIT编译器编译成机器熟悉的机器语言。

     

    3. Get Started

     

    以下内容演示在Windows10和CentOS 7.2下的命令行生成和发布demo

     

    3.1 Win 10

     

     

    3.1.1 安装.NET Core SDK.NET Core Runtime

     

    .NET Core SDK = 使用.NET Core开发应用.NET Core Runtime 和 SDK+CLI 工具

     

    3.1.2 简单的运行结果

     

    打开cmd,依次输入mkdir .project(创建目录),cd .\.project(进入目录),dotnet new(新建初始项目),dotnet restore(还原依赖),dotnet run(运行)即可运行第一个Hello World程序

     

    3.2 CentOS 7.2(本地Hyper-V)

     

     

    3.2.1 安装和运行

     

    详情请见:.NET Core in CentOS,大致命令如下

    sudo yum install libunwind libicu   #安装libunwind,libicu包
    
    curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=809131 #下载dotnet-dev-centos-x64.1.0.0-preview2-003121.tar文件,有时会因为网络问题下载较慢,耐心等待即可,当然也可以手动下载后放到目录下。
    
    sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet #创建目录并解压已下载文件
    sudo ln -s /opt/dotnet/dotnet /usr/local/bin #将目录链接到$PATH下,否则dotnet命令无法识别
    
    mkdir hwapp
    cd hwapp
    
    dotnet new #创建默认.NET Core应用
    dotnet restore #还原依赖包
    dotnet run #运行,结果将显示Hello World!

    第六行命令后可使用dotnet --info查看是否链接成功,显示如下

    .NET Command Line Tools (1.0.0-preview2-003121)
    
    Product Information:
     Version:            1.0.0-preview2-003121
     Commit SHA-1 hash:  1e9d529bc5
    
    Runtime Environment:
     OS Name:     centos
     OS Version:  7
     OS Platform: Linux
     RID:         centos.7-x64

    以上步骤在.NET Core官方网站都可以找到,可以看到应用在经过简单的dotnet new, dotnet restore, dotnet run命令后就跑起来了,但是这其实是类似于开发环境中的调试运行,而且win上new的应用此时也不能直接跨平台到Linux下运行,所以我们又得提到dotnet publish命令了

     

    3.2.2 Self-contained applications 发布

     

     

    (1) 修改project.json文件

     

    我们现在win10下按照步骤new一个新的HW控制台应用self,按照官方文档要求,我们需要用以下内容替换原来project.json文件(删除"type": "platform",并增加runtimes节点)

    {
      "version": "1.0.0-*",
      "buildOptions": {
        "debugType": "portable",
        "emitEntryPoint": true
      },
      "dependencies": {},
      "frameworks": {
        "netcoreapp1.0": {
          "dependencies": {
            "Microsoft.NETCore.App": {
              "version": "1.0.0"
            }
          },
          "imports": "dnxcore50"
        }
      },
      "runtimes":{
       "win10-x64":{}, #win10平台
       "centos.7-x64":{} #centos7.2平台
      }
    }

     

    (2) 执行restore和publish操作

     

    之后执行dotnet restore指令,针对平台进行还原操作。该步操作耗时较久,虽然只是两个平台,第一次也花了较长时间。紧接着进行进行dotnet publish -r centos.7-x64 -c release

    dotnet publish指令详见dotnet-publish - Packs the application and all of its dependencies into a folder getting it ready for publishing

     

    (3) 在Linux平台上运行

     

    上述操作后,我们只需要将发布后的文件夹(bin/release/netcoreapp1.0/centos7-x64/publish,包含self.exe)上传到Linux root目录下project(新建)文件夹中, 在Shell中输入指令

    修改可执行权限后,即可成功运行“Hello World”,这就是我们“Self-contained applications”方式的部署方法

     

    4. 总结

     

     

    4.1 尾声

     

    至此,.NET Core的学习便告一段落了,以上内容简单介绍了.NET Core的组成和特性,同时也在Windows和Linux系统上通过两种不同的部署方式成功运行了示例。相比较之前的.NET Framework傻瓜式部署,.NET Core的新奇真是让我眼前一亮。接下来,我也会将.NET Core和ASP.NET Core的学习记录下来,欢迎指正。

     

    4.2 相关学习资料

     

     

    5. 参考资料

     

    展开全文
  • net.core 官方教程

    2020-07-30 23:31:49
    net.core 官方文档 官方教程 c#
  • .net core && python

    2019-10-01 13:18:01
    最近.net core的发展,确实值得激动,强力推荐传教文章《.NET:持续进化的统一开发平台》http://www.cnblogs.com/wer-ltm/p/8776846.html  作为使用.net挣钱活口的码农来说,本无法评价微软以及.net本身,但看到...

      最近.net core的发展,确实值得激动,强力推荐传教文章《.NET:持续进化的统一开发平台》http://www.cnblogs.com/wer-ltm/p/8776846.html 

      作为使用.net挣钱活口的码农来说,本无法评价微软以及.net本身,但看到.net社区能够成长起来,自然还是美事一桩。不过,从大学还没毕业开始入了webform、silverlight、Winform、Win8 App、WinPhone 8、UAP、WPF,各种折腾和工作机遇的变换莫测之后,最终还是没有了勇气再入UWP的怀抱了,也主要是没有相应的工作机会。现在主要稳定在使用WPF做PC客户端项目、.net core 做Api后台项目。对于情怀还是有的,就是入手了Microsoft Lumia 950,就一直让它处于吃灰状态。?还是iOS的好,尽管我用的其实是华为Android。

      2016年6月多开始,选定了Python作为第二语言之后,基本上到现在也看了几本经典书籍、也买了两本以表真心。最近也用Python写一些项目中的帮助类工具,也做一些数据分析相关的引擎用于项目中。总之一句话,C#||Python Or C#&&Python,无所谓第一第二了。

      随着工作职责的变迁,也正式干起了技术经理的行当,越来越对语言和平台,没有那么强烈的维护感了。反正都能用,那个用起来顺手就用那个。

      不过在此还是有几个观点,也算是心态表一表,对同行用于切磋切磋。

      我喜欢Python ,我接受Python很慢、全局解释锁,更接受Python是AI、机器学习钦定语言;

      我热爱.net,我接受.net在国内薪资低、高薪/大舞台的工作机会少,更接受 全宇宙第一IDE 钦定平台是.net。

      其实就是,鱼和熊掌不能兼得的问题。高薪一般会意味着加班多、高强度工作量,所以基本不用羡慕前端或Java普遍薪资较高,也承认.net高薪的工作几乎越来越少了,最近面试中也遇到一些无论如何都找不到纯开发或初级架构某个期望值[暂时保密]的工作机会(这有个大前提,这些同行是有这个高薪实力的)。IT行业招聘确实有着 花三个人的钱,招两个人,干四个人的活,不然高薪从哪里的?最后有一点也是彼此大家都承认的,做.net的“轻松”点的工作机会相对多点,凡是需要加班加点的,基本就打个酱油,边找边过渡了。

      扯这么些,就一个共识。高薪都是加班加出来的,.net钱少事也必须少。

      对于一般公司而言,能招到中级就够了,能干活就行了。

     

     

    转载于:https://www.cnblogs.com/KendoCross/p/8849921.html

    展开全文
  • 使用 C#/.NET Core 实现单体设计模式   本文的概念内容来自深入浅出设计模式一书 由于我在给公司做内培, 所以最近天天写设计模式的文章.... 单体模式 Singleton 单体模式的目标就是只创建一个实例. 实际中有很多...

    使用 C#/.NET Core 实现单体设计模式

     

    本文的概念内容来自深入浅出设计模式一书

    由于我在给公司做内培, 所以最近天天写设计模式的文章....

    单体模式 Singleton

    单体模式的目标就是只创建一个实例.

    实际中有很多种对象我们可能只需要它们的一个实例, 例如: 线程池,缓存, 弹出的对话框, 用于保存设置的类, 用于logging的类, 硬件设备驱动对象等等.

    一段对话:

    A: 如何创建一个对象?

    B: new MyObject()

    A: 如果想创建另一个对象, 就再次new MyObject()?

    B: 是的

    A: 所以说我们有某个类, 我们就可以对它实例化很多次?

    B: 是的, 但是它必须是public的类额

    A: 如果不是public的呢?

    B: 如果不是public的, 那么只有同一个包下的类才能对它实例化, 但是仍然可以实例化多次.

    A: 嗯, 很有趣, 你只你可以这样做吗?

    B: 没见过, 但是语法是没问题的, 存在即合理.

    A: 它是什么意思呢?

    B: 我想它不能被实例化吧, 因为它的构造函数是private的啊.

    A: 那么, 有没有哪个对象可以使用这个private的构造函数呢?

    B: 额, 我认为只有MyClass里面的代码可以调用这个构造函数, 但是感觉那没什么用啊.

    A: 为什么没用呢?

    B: 因为对类进行实例化, 就是想要用它的实例, 而这样做的话, 别的类也无法对它进行实例化啊. 这是个鸡和蛋的问题: 我可以使用MyClass里面的构造函数, 但是我无法实例化这个对象, 因为其他的类无法使用 "new MyClass()".

    A: 你着确实是一种观点, 那么下面代码是什么意思呢?

    B: MyClass有一个静态方法, 我们可以这样调用静态方法: MyClass.getInstance();

    A: 为什么使用MyClass, 而不是某个对象的名?

    B: 因为getInstance()是静态方法; 也就是说, 它是一个类方法, 你需要使用类名来调用方法.

    A: 非常有趣, 那么我把实例化代码放里面呢?

    B: 确实可以有这种操作...

    A: 那么, 现在你认为有第二种方法来实例化对象吗?

    B: MyClass.getInstance();

    A: 那么你现在能写出只允许创造一个MyClass实例的代码了吗?

    B: 应该行.

     

    经典单体模式的实现

    首先需要有个静态成员变量保留着实例的引用.

    然后构造函数必须是私有的.

    getInstance()方法可以该类进行实例化, 并且返回该实例.

    另外, 该类也可以有其他方法.

    里面最重要的一部分代码:

    如果该实例引用为null, 那么创建一个实例, 并把这个实例赋給类的那个成员变量. 这里要注意, 如果我们永远不需要这个类的实例, 那么这个类永远也不会被实例化, 这叫做懒初始化.

    如果实例引用不是null, 那么就说明之前已经创建过该类的实例了, 那么就返回之前创建的实例就行了.

     

    一道巧克力工厂锅炉的题

    先看这个类:

    开始的时候, 锅炉是空的, 所以也没有煮沸.

    fill()方法(填充), 填充锅炉的时候, 锅炉必须是空的, 一旦填满了, 那么empty就改为false, 表示填满了. 刚填满肯定不是煮沸状态, 所以boiled也是false.

    drain()方法(抽取), 只有锅炉是满的并且煮沸之后才能抽取巧克力液体, 抽取完了, 锅炉就又空了 empty改为true.

    boil()方法(煮), 煮混合液体, 要求锅炉的前提状态必须是满的 empty为false, 并且还没煮沸 boiled为false. 一旦煮沸了, 就把boiled改成true.

    这个工序很好, 但是必须保证只有一个锅炉, 那么该怎么做? 请写出代码.

    单体模式定义

    单体模式保证一个类只有一个实例, 并提供一个全局访问该实例的方法.

    类图:

     

    其他问题

    上面巧克力锅炉那道题你可能写好了, 但是可能会出现这个问题:

    锅炉可能在里面有液体的情况下又进行了fill填充动作. 这是怎么回事?

    是不是其他线程引起的这个问题?

    我们可能有两个线程都在执行这段代码:

    那么两个线程调用时是否有重叠, 代码执行是否有交错?  请看下图:

    处理多线程问题

    为了解决这个多线程的问题问题, 可已使用synchronized方法:

    (synchronized是java里的关键字, C#的请参考下面我写的代码)

    使用synchronized关键字以后, 每个线程必须等到轮到它的时候才能进入方法. 这样两个线程就不可能同时进入该方法了.

    但是这种方法开销很大, 这有时会成为一个问题. 而且可能比你想的更糟糕:

    只有第一次执行该方法的时候synchronized才起作用, 一旦我们设定好了成员变量那个引用到具体的实例, 以后就不需要synchronized这个方法了, 除了第一次, 以后这就是额外的开销.

    还能改进多线程吗

    1. 如果性能不是那么重要, 就继续使用synchronized吧. 但是要记住使用synchronized之后运行速度可能会差100倍(JVM).

    2. 那就不如早点把实例给创建出来, 而不是懒创建.

    例如:

    使用静态的成员引用, 这样类在加载的时候就把实例创建出来了(保证在任何线程访问之前就会创建出来).

    3. 使用"双重检查锁"来减少对sync的使用.

    这就是首先检查实例是否被创建了, 如果没有那么进入sync块. 第一创建实例的时候时sync的, 在块里面, 再检查一次实例是否为null, 然后创建实例.

    volatile关键字会保证被单体实例化的时候多线程会正确的处理uniqueInstance变量.

    所以如果性能是问题, 就可以使用这个方法.

    其他问题

    Q: 如果我创建一个类, 里面都是静态方法和静态变量, 那么它的效果和单体模式不是一样的吗?

    A: 是的, 如果你类没有其他依赖并且初始化并不复杂的话.

    Q: 可以继承单体模式吗?

    A: 简单的回答就是: No.

    Q: 为什么单体模式比全局变量好?

    A: 全局变量会污染命名空间, 当然了单体模式写不好也很烂.

    总结

    C# 实现

    ChocolateBoiler:

    复制代码
    namespace SingletonPattern
    {
        public class ChocolateBoiler
        {
            public bool Empty { get; private set; }
            public bool Boiled { get; private set; }
    
            private static ChocolateBoiler _uniqueInstance;
    
            private ChocolateBoiler()
            {
                Empty = true;
                Boiled = false;
            }
    
            public static ChocolateBoiler GetInstance()
            {
                return _uniqueInstance ?? (_uniqueInstance = new ChocolateBoiler());
            }
    
            public void Fill()
            {
                if (Empty)
                {
                    Empty = false;
                    Boiled = false;
                }
            }
    
            public void Drain()
            {
                if (!Empty && Boiled)
                {
                    Empty = true;
                }
            }
    
            public void Boil()
            {
                if (!Empty && !Boiled)
                {
                    Boiled = true;
                }
            }
        }
    }
    复制代码

     

    SynchronizedChocolateBoiler:

    复制代码
    using System.Runtime.CompilerServices;
    
    namespace SingletonPattern
    {
        public class SynchronizedChocolateBoiler
        {
            public bool Empty { get; private set; }
            public bool Boiled { get; private set; }
    
            private static SynchronizedChocolateBoiler _uniqueInstance;
    
            private SynchronizedChocolateBoiler()
            {
                Empty = true;
                Boiled = false;
            }
    
            [MethodImpl(MethodImplOptions.Synchronized)]
            public static SynchronizedChocolateBoiler GetInstance()
            {
                return _uniqueInstance ?? (_uniqueInstance = new SynchronizedChocolateBoiler());
            }
    
            public void Fill()
            {
                if (Empty)
                {
                    Empty = false;
                    Boiled = false;
                }
            }
    
            public void Drain()
            {
                if (!Empty && Boiled)
                {
                    Empty = true;
                }
            }
    
            public void Boil()
            {
                if (!Empty && !Boiled)
                {
                    Boiled = true;
                }
            }
        }
    }
    复制代码

     

    DoubleCheckChocolateBoiler:

    复制代码
    namespace SingletonPattern
    {
        public class DoubleCheckChocolateBoiler
        {
            public bool Empty { get; private set; }
            public bool Boiled { get; private set; }
    
            private static volatile DoubleCheckChocolateBoiler _uniqueInstance;
            private static readonly object LockHelper = new object();
    
            private DoubleCheckChocolateBoiler()
            {
                Empty = true;
                Boiled = false;
            }
    
            public static DoubleCheckChocolateBoiler GetInstance()
            {
                if (_uniqueInstance == null)
                {
                    lock (LockHelper)
                    {
                        if (_uniqueInstance == null)
                        {
                            _uniqueInstance = new DoubleCheckChocolateBoiler();
                        }
                    }
                }
                return _uniqueInstance;
            }
    
            public void Fill()
            {
                if (Empty)
                {
                    Empty = false;
                    Boiled = false;
                }
            }
    
            public void Drain()
            {
                if (!Empty && Boiled)
                {
                    Empty = true;
                }
            }
    
            public void Boil()
            {
                if (!Empty && !Boiled)
                {
                    Boiled = true;
                }
            }
        }
    }
    复制代码

    由于这里面提到了多线程, 所以我会另写一篇关于C#/.NET Core异步和多线程的文章(也会是书上的内容, 这本书叫 C# 7 in a Nutshell, 我认为这是最好的C#/.NET Core参考书, 可是没有中文的, 所以我就是做一下翻译和精简)....

    这个系列的代码我放在这里了: https://github.com/solenovex/Head-First-Design-Patterns-in-CSharp

    展开全文
  • 我准备用.NET Core及第三方库实现里面所有的例子.  这是第一部分, 主要使用的是AngleSharp: https://anglesharp.github.io/ (文章的章节书与该书是对应的) 第1章 初见网络爬虫 发送Http请求  在python里面...
  • .Net Core(三)MVC Core

    2019-06-15 23:09:35
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • .NET Core 已经发布好几年了,很多.NET 程序员也一定跟我一样心中一直有以下疑问, .NET Core到底是不是 .NET 的下一个版本?还是说只是 .NET 支持跨平台的一个版本? 作为传统的 .NET 开发者或者说开发的程序都是...
  • 浅谈.Net Core

    千次阅读 2019-09-18 07:26:00
    好感慨,从第一次接触微软的语言(2004年自学VB,暴露年龄了,呵呵),然后升级VB.Net,之后转到C#怀抱,习惯了微软全家桶后,一直无法有效的摆脱微软的魔掌,因为项目需要陆陆续续使用过PHP,JAVA,QT等,但是别人...
  • .NET Core是什么

    千次阅读 2019-06-09 00:41:59
    .NET Core就是如此,它是其它操作系统的.NET Framework翻版实现。 操作系统不止Windows,还有Mac和类Linux等系统, .NET的实现 如果按操作系统来横向分割的话,可以分为 Windows系统下的 .NET Framework 和 兼容多...
  • 最近公司的电脑升级了,安装了一个新的环境,VS2017等,然后运行一下项目发现报错:当前 .NET SDK 不支持将 .NET Core 2.2 设置为目标。请将 .NET Core 2.1 或更低版本设置。 猜想应该是没有安装,就到官网下载了...
  • .NET Framework 和 .NET Core 是平台应用框架,而 .NET Standard 是 .NET 底层库。因此只要用 .NET Standard 工程来写的代码可以直接在上层的平台应用框架上使用。 你的库需要在多平台应用上使用,就使用 .NET ...
  • 什么是Asp.Net core 我相信很多C# Developer已经对于.net core不算陌生了,就算没有正式使用相信也应该有所了解。微软在推出来.net core的同时为了方便一些原有的项目可以方便迁移,同时推出了Asp.net core。那么...
  • .net core.net framework之间的关系

    千次阅读 2018-12-21 16:34:00
    .net core.net framework 是.net standard 在不同平台下的具体实现。   .net core的api种类 从.net framework 去除了以下内容 1. 和GUI相关的WForm和WPF, 它们绑定了windows 系统 2.Asp.Net WebForms 和...
  • .NET Core.NET Standard有什么不同

    万次阅读 2017-10-13 11:43:33
    近日,微软发布了.NET Core 2.0,但是开发人员中间仍然存在一些疑惑,就是.NET Core.NET Standard、Xamarin和.NET Framework有什么不同。 .NET Framework用于构建桌面应用程序和运行在互联网信息服务器(IIS...
  • 简析.NET Core 以及与 .NET Framework的关系

    万次阅读 多人点赞 2016-06-23 09:03:58
    ******************************************************* 简析.NET Core 以及与 .NET Framework的关系 一 .NET 的 Framework 们二 .NET Core的到来 1. Runtime2. Un
  • NET Core 发展及各版本区别

    万次阅读 2018-07-26 14:04:24
    本月14日,微软发布.NET Core 2.0 正式版,它的发布意味着.NET Core平台更加成熟,也预示其更美好的未来。本文将分析.NET Core 的特性以及未来发展方向,为开发人员选择在何种平台开发程序提供参考。 1.1. ...
  • 解决:当前 .NET SDK 不支持将 .NET Core 3.0 设置为目标 解决该bug的途径有两种: 1. 将 .NET Core 2.1 或更低版本设置为目标 2. 使用支持 .NET Core 3.0 的 .NET SDK 版本 由于开发平台是Microsoft .NET ...
  • 简述关于ASP.NET MVC与.NET CORE 的区别

    千次阅读 2019-08-15 10:30:01
    简述关于ASP.NET MVC与.NET CORE的区别 1、关于ASP.NET 关于MVC 刚开始接触这个技术的时候我经常不理解他们的名字,我相信许多学ASP.NET开发人员开始接触MVC应该也和我一样产生很多为什么,也会误认为认为MVC与ASP...
  • 使用VS打开.Net Core的新项目时遇到了这个错误,我用的是VS2017版。 在网上找解决方案,得知需要右键项目——选择属性——应用程序——选择目标框架,选择“安装其他目标框架”,会跳转到官网下载新的.Net Core...
1 2 3 4 5 ... 20
收藏数 378,155
精华内容 151,262
关键字:

.netcore