CodeSnippet.Cn
代码片段
Csharp
架构设计
.NetCore
西班牙语
kubernetes
MySql
Redis
Algorithm
Ubuntu
Linux
Other
.NetMvc
VisualStudio
Git
pm
Python
WPF
java
Plug-In
分布式
CSS
微服务架构
JavaScript
DataStructure
Shared
通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?(七)
0
.NetCore
Csharp
小笨蛋
发布于:2021年04月07日
更新于:2021年04月07日
185
#custom-toc-container
**[通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?(一)](https://www.codesnippet.cn/home/list/16 "通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?(一)")** **[通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?(二)](https://www.codesnippet.cn/home/list/17 "通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?(二)")** **[通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?(三)](https://www.codesnippet.cn/home/list/18 "通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?(三)")** **[通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?(四)](https://www.codesnippet.cn/home/list/19 "通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?(四)")** **[通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?(五)](https://www.codesnippet.cn/home/list/20 "通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?(五)")** **[通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?(六)](https://www.codesnippet.cn/home/list/21 "通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?(六)")** ### .NET程序执行图 至此,.NET Framework上的三个重要概念,程序集、应用程序域、内存在本文讲的差不多了,我画了一张图简单的概述.NET程序的一个执行流程: ![图片alt](/uploads/images/20210605/153016-625f04dd42e64fa486eded4cff0145b8.png ''图片title'') 对于后文,我将单独的介绍一些其它杂项,首先是.NET平台的安全性。 ### .NET的安全性 .NET Framework中的安全机制分为 基于角色的安全机制 和 代码访问安全机制 。 #### 基于角色的安全性 基于角色的安全机制作为传统的访问控制,其运用的非常广泛,如操作系统的安全策略、数据库的安全策略等等...它的概念就相当于我们经常做的那些RBAC权限管理系统一样,用户关联角色,角色关联权限,权限对应着操作。 整个机制的安全逻辑就和我们平时编写代码判断是一样的,大致可以分为两个步骤. 第一步就是创建一个主体,然后标识这个主体是什么身份(角色) ,第二步就是 身份验证,也就是if判断该身份是否可以这样操作。 而在.NET Framework中,这主体可以是Windows账户,也可以是自定义的标识,通过生成如当前线程或应用程序域使用的主体相关的信息来支持授权。 比如,构造一个代表当前登录账户的主体对象WindowsPrincipal,然后通过 AppDomain.CurrentDomain.SetThreadPrincipal(主体对象);或Thread.CurrentPrincipal的set方法来设置应用程序域或线程的主体对象, 最后使用System.Security.Permissions.PrincipalPermission特性来标记在方法上来进行授权验证。 ![图片alt](/uploads/images/20210605/153052-a1f72593c7be4bf38b444ee9ea17f005.png ''图片title'') 如图,我当前登录账号名称为DemoXiaoZeng,然后通过Thread.CurrentPrincipal设置当前主体,执行aa方法,顺利打印111。如果检测到PrincipalPermission类中的Name属性值不是当前登录账号,那么就报错:对主体权限请求失败。 ![图片alt](/uploads/images/20210605/153104-2ef001e625524d2aad1c4687994edf22.png ''图片title'') 在官方文档中有对.NET Framework基于角色的安全性的详细的介绍,感兴趣可以去了解 https://docs.microsoft.com/zh-cn/dotnet/standard/security/principal-and-identity-objects#principal-objects #### 代码访问安全性 在.NET Framework中还有一个安全策略,叫做 代码访问安全Code Access Security,也就是CAS了。 代码访问安全性在.NET Framework中是用来帮助限制代码对受保护资源和操作的访问权限。 举个例子,我通过创建一个FileIOPermission对象来限制对后续代码对D盘的文件和目录的访问,如果后续代码对D盘进行资源操作则报错。 ![图片alt](/uploads/images/20210605/153126-e822a8eb1a8f45fe8a98b8999e0c773b.png ''图片title'') FileIOPermission是代码控制访问文件和文件夹的能力。除了FileIOPermission外,还有如PrintingPermission代码控制访问打印机的权限、RegistryPermission代码控制操作注册表的权限、SocketPermission控制接受连接或启动Socket连接的权限。 对于这些通过代码来对受保护资源和操作的权限限制,也就是这些类名后缀为Permission的类,它们叫做 Permissions(权限),都继承自CodeAccessPermission,都有如Demand,Assert,Deny,PermitOnly,IsSubsetOf,Intersect和Union这些方法,在MSDN上有完整的权限列表:https://msdn.microsoft.com/en-us/library/h846e9b3(v=vs.100).aspx 为了确定代码是否有权访问某一资源或执行某一操作,CLR的安全系统将审核调用堆栈,以将每个调用方获得的权限与要求的权限进行比较。 如果调用堆栈中的任何调用方不具备要求的权限,则会引发安全性异常并拒绝访问。 ![图片alt](/uploads/images/20210605/153145-92a9c13f72f54fcbac9d9edcc7896a54.png ''图片title'') 而除了Permissions权限,代码访问安全性机制还有 权限集、证据、代码组、策略等概念。这些概念让CAS如此强大,但相应的,它们也让CAS变得复杂,必须为每个特定机器定义正确的PermissionSet和Code Groups才能设置成一个成功的CAS策略。 考虑到这层原因,Microsoft .NET安全小组决定从头开始重建代码访问安全性。在.NET Framework4.0之后,就不再使用之前的那套CAS模型了,而是使用.NET Framework 2.0中引入的安全透明模型,然后稍加修改,修改后的安全透明模型成为保护资源的标准方法,被称之为:安全透明度级别2 安全透明度2介绍:https://msdn.microsoft.com/en-us/library/dd233102(v=vs.100).aspx .NET Framework4.0的安全更改:https://msdn.microsoft.com/en-us/library/dd233103(v=vs.100).aspx 一个完整的CAS演示:https://www.codeproject.com/Articles/5724/Understanding-NET-Code-Access-Security 对于安全透明度级别2我将不再介绍,感兴趣的可以看我推荐的这2篇文章,对Level2的安全透明度介绍的比较详细,包括实践、迁移。 https://www.red-gate.com/simple-talk/dotnet/.net-framework/whats-new-in-code-access-security-in-.net-framework-4.0---part-i/ https://www.red-gate.com/simple-talk/dotnet/net-framework/whats-new-in-code-access-security-in-net-framework-4-0-part-2/ ---------------------------------------------- 须注意: .NET平台上的安全机制,仅仅是.NET平台上的,因此它只限制于托管代码,我们可以直接调用非托管代码或进程通信间接调用非托管代码等多个手段来突破对托管代码 操作资源的限制。 事实上,我们在平常项目中代码编写的安全机制(业务逻辑身份验证、项目框架验证)与这些平台级的安全机制没什么不同。我们可以理解为代码写的位置不一样,.NET安全机制是写在CLR组件中,而我们的安全机制是写在上层的代码中。这些平台级的标识更多的是和操作系统用户有关,而我们项目代码中的标识则是和在数据库中注册的用户有关, 大家都是通过if else来去判断,判断的主体和格局不一样,逻辑本质都是相同的。 NET Core不支持代码访问安全性和安全性透明性。 ### .NET是什么 我在前文对.NET系统概述时,有的直接称.NET,有的称.NET Framework。那么准确来说什么是.NET?什么又是.NET Framework呢? .NET是一个微软搭造的开发者平台,它主要包括: - 1.支持(面向)该平台的编程语言(如C#、Visual Basic、C++/CLI、F#、IronPython、IronRuby...), - 2.用于该平台下开发人员的技术框架体系(.NET Framework、.NET Core、Mono、UWP等), - 1.定义了通用类型系统,庞大的CTS体系 - 2.用于支撑.NET下的语言运行时的环境:CLR - 3..NET体系技术的框架库FCL - 3.用于支持开发人员开发的软件工具(即SDK,如VS2017、VS Code等) #### .NET Framework是什么 事实上,像我上面讲的那些诸如程序集、GC、AppDomain这样的为CLR的一些概念组成,实质上指的是.NET Framework CLR。 .NET平台是微软为了占据开发市场而成立的,不是无利益驱动的纯技术平台的那种东西。基于该平台下的技术框架也因为 商业间的利益 从而和微软自身的Windows操作系统所绑定。所以虽然平台雄心和口号很大,但很多框架类库技术都是以Windows系统为蓝本,这样就导致,虽然.NET各方面都挺好,但是用.NET就必须用微软的东西,直接形成了技术-商业的绑定。 .NET Framework就是.NET 技术框架组成在Windows系统下的具体的实现,和Windows系统高度耦合,上文介绍的.NET系统,就是指.NET Framework。 部署.net Framework :https://docs.microsoft.com/zh-cn/dotnet/framework/deployment/deployment-guide-for-developers .NET Framework高级开发:https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2008/29eafad8(v%3dvs.90) .NET Framework源码在线浏览:https://referencesource.microsoft.com/ #### 如何在VS中调试.NET Framework源代码 最为关键的是pdb符号文件,没得符号就调不了,对于符号我们从微软的符号服务器上下载(默认就已配置),还得有源代码来调试。 点击工具-选项-调试-常规,如果你之前没有在该配置栏配置过,那么你就勾选 启用源服务器支持 、启用.net Framework源代码单步执行,然后将 要求源文件与原始版本完全匹配 给取消掉。 然后就是下载pdb符号文件了,如果想直接下载那么可以在调试-符号这栏 将Microsoft符号服务器给勾上 。如果想按需下载,那么在调试的时候,可以点击调试-窗口 选择 模块/调用堆栈 来选择自己想加载的去加载。 然后至 https://referencesource.microsoft.com/网站 点击右上角下载源代码。当你调试代码的时候,会提示你无可用源,这个时候你再将你下载下来的源码文件给浏览查找一下就可以了。 ![图片alt](/uploads/images/20210605/153306-c030878e77214eccbb2a2643a17f23e1.png ''图片title'') 如何配置VS来调试.NET Framework源码: https://referencesource.microsoft.com/#q=web 、 https://technet.microsoft.com/zh-cn/cc667410.aspx 还一种方法是,下载.NET Reflector插件,该插件可以帮助我们在VS中直接调试dll,这种方式操作非常简单,不过该插件收费,具体的可以查看我之前写过的文章(群里有该插件的注册版) #### .NET Core是什么 有丑才有美,有低才有高,概念是比较中诞生的。.NET Core就是如此,它是其它操作系统的.NET Framework翻版实现。 操作系统不止Windows,还有Mac和类Linux等系统, .NET的实现 如果按操作系统来横向分割的话,可以分为 Windows系统下的 .NET Framework 和 兼容多个操作系统的 .NET Core。 我们知道,一个.NET程序运行核心在于.NET CLR,为了能让.NET程序在其它平台上运行,一些非官方社区和组织为此开发了在其它平台下的.NET实现(最为代表的是mono,其团队后来又被微软给合并了 ),但因为不是官方,所以在一些方面多少有些缺陷(如FCL),后来微软官方推出了.NET Core,其开源在Github中,并被收录在NET基金会(.NET Foundation,由微软公司成立与赞助的独立自由软件组织,其目前收录包括.NET编译器平台("Roslyn")以及ASP.NET项目系列,.NET Core,Xamarin Forms以及其它流行的.NET开源框架),旨在真正的 .NET跨平台。 .NET Core是.NET 技术框架组成在Windows.macOS.Linux系统下的具体的实现。 .NET Core是一个开源的项目,其由 Microsoft 和 GitHub 上的 .NET 社区共同维护,但 这份工作仍然是巨大的,因为在早期对.NET上的定义及最初的实现一直是以Windows系统为参照及载体,一些.NET机制实际上与Windows系统耦合度非常高,有些属于.NET自己体系内的概念,有些则属于Windows系统api的封装。 那么从Windows转到其它平台上,不仅要实现相应的CLR,还要舍弃或重写一部分BCL,因而,.NET Core在概念和在项目中的行为与我们平常有些不同。 比如,NET Core不支持AppDomains、远程处理、代码访问安全性 (CAS) 和安全透明度,任何有关该概念的库代码都应该被替换。 这部分代码它不仅指你项目中的代码,还指你项目中using的那些程序集代码,所以你会在github上看到很多开源项目都在跟进对.NET Core的支持,并且很多开发者也尝试学习.NET Core,这也是一种趋势。 .NET Core指南https://docs.microsoft.com/en-us/dotnet/core/ .NET基金会:https://dotnetfoundation.org .NET Core跨平台的行为变更:https://github.com/dotnet/corefx/wiki/ApiCompat #### .NET Standard是什么 值得一提的是微软还为BCL提出了一个标准,毕竟各式各样的平台,技术层出不穷,为了防止.NET在类库方面的碎片化,即提出了一套正式的 .NET API (.NET 的应用程序编程接口)规范,.NET Standard。 正如上面CLS一样,.NET Standard就类似于这样的一个概念,无论是哪个托管框架,我们遵循这个标准,就能始终保持在BCL的统一性,即我不需要关心我是用的.NET Framework还是.NET Core,只要该类被定义于.NET Standard中,我就一定能在对应支持的.NET Standard的版本的托管框架中找到它。 ![图片alt](/uploads/images/20210605/153359-fc4f200b828b4871aef08102dc597315.png ''图片title'') .NET Standard: https://docs.microsoft.com/zh-cn/dotnet/standard/net-standard#net-implementation-support .NET Standard开源代码:https://github.com/dotnet/standard #### .NET官方开源项目链接 现在我将给出.NET相关的开源项目地址: 参与.NET和.NET开源项目的起点:https://github.com/Microsoft/dotnet - .NET Core:https://github.com/dotnet/core - .NET Core文档:https://github.com/dotnet/docs - ASP.NET Core:https://github.com/aspnet/home - ASP.NET Core文档:https://github.com/aspnet/Docs - EntityFramework Core框架:https://github.com/aspnet/EntityFrameworkCore - ASP.NET Core MVC框架:https://github.com/aspnet/Mvc - EntityFramework6:https://github.com/aspnet/EntityFramework6 - .NET Framework源码:https://github.com/microsoft/referencesource - .NET Core基类库:https://github.com/dotnet/corefx - .NET Core CLR:https://github.com/dotnet/coreclr - Roslyn编译器:https://github.com/dotnet/roslyn - MVC5、Web API2、Web Pages3框架源码:https://github.com/aspnet/AspNetWebStack - .NET Standard:https://github.com/dotnet/standard - KestrelHttpServer用于ASP.NET Core的跨平台Web服务器:https://github.com/aspnet/KestrelHttpServer - Visual Studio Code源码:https://github.com/Microsoft/vscode - 一些优秀的.NET库、工具、框架、软件开源集合:https://github.com/quozd/awesome-dotnet - 一些常用框架对ASP.NET Core和.NET Core的支持报告:https://github.com/jpsingleton/ANCLAFS - 一些.NET下用于支持开发的开源项目集合:https://github.com/Microsoft/dotnet/blob/master/dotnet-developer-projects.md - 微软出品的分布式框架orleans:https://github.com/dotnet/orleans - ML.NET 用于.NET的开源和跨平台机器学习框架:https://github.com/dotnet/machinelearning
这里⇓感觉得写点什么,要不显得有点空,但还没想好写什么...
返回顶部
About
京ICP备13038605号
© 代码片段 2024