1..NET core扫盲
2.visual studio2015社åºçåä¼ä¸ççåºå«
3.C# 9 新功能“源代码生成器”,源码你用了吗?
4.一个开源轻量级的源码C#代码格式化工具(支持VS和VS Code)
5.怎么看待rust体系中rowan的红绿树?
6.C# Roslyn动态生成代码
.NET core扫盲
.NET发行至今已经过了十四个年头。随着版本的源码不断迭代更新,.NET在Windows平台上的源码表现也是越来越好,可以说Windows平台上所有的源码应用类型.NET几乎都能完成。只是源码智慧树源码大全成也Windows,败也Windows,源码这十四年来,源码除了部分“民间”版本,源码.NET一直没能在官方支持下摆脱Windows平台的源码局限,“开源”和“跨平台”这两个词语也是源码所有.NET开发者心中的痛楚。最终,源码.NET Core出现了,源码它让开发者们在官方和社区的源码支持走出了Windows,可以在macOS,源码Linux主流distributions上编写调试并部署.NET程序。
.NET Core是一个开源通用的开发框架,支持跨平台,即支持在Window,macOS,Linux等系统上的开发和部署,并且可以在硬件设备,云服务,和嵌入式/物联网方案中进行使用。.NET Core的源码放在 GitHub上,由微软官方和社区共同支持。它和传统的.NET Framework,属于“子集—超集”的关系,或者你也可以简单地认为它就是.NET Framework的跨平台版本(基于 BCL的层面上看)。这是因为在当前版本中(1.0),.NET Core中的大部分核心代码都是从.NET Framework中继承重写的,包括Runtime和Libraries(如GC, JIT, 部分类型)。
现在的.NET Core 1.0版本是一个很小的核心,APIs和工具也并不完整,但是随着.Net Core的不断完善,补充的Apis和创新也会一起整合到.NET Framework中。也就是caffe源码解析 net说,.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标准。
Tips:是不是想起了MSCorEE.dll这个垫片,它同样承载着Windows平台上为.NET应用程序选择CLR版本的工作
第二种方式和.NET Native也是不一样的,仍然使用CoreCLR,而.NET Native使用CoreRT作为运行时,详细信息请见 dotnet/corert
.NET Core 1.0版本中支持的编程语言仅有C#(F#和VB暂未实现),这里还要提到一个开源的语言编译器Roslyn,它负责将代码编译成我们熟悉的IL语言,然后再借由AOT或JIT编译器编译成机器熟悉的机器语言。
以下内容演示在Windows和CentOS 7.2下的命令行生成和发布demo
3.1 Win
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,大致命令如下
第六行命令后可使用dotnet --info查看是否链接成功,显示如下
以上步骤在.NET Core官方网站都可以找到,可以看到应用在经过简单的dotnet new, dotnet restore, dotnet run命令后就跑起来了,但是这其实是类似于开发环境中的调试运行,而且win上new的应用此时也不能直接跨平台到Linux下运行,所以我们又得提到dotnet publish命令了
3.2.2 Self-contained applications 发布 (1) 修改project.json文件 我们现在win下按照步骤new一个新的HW控制台应用self,按照 官方文档要求,我们需要用以下内容替换原来project.json文件(删除"type": "platform",并增加runtimes节点)
(2) 执行restore和publish操作
之后执行dotnet restore指令,针对平台进行还原操作。该步操作耗时较久,虽然只是两个平台,第一次也花了较长时间。解析屏蔽广告源码紧接着进行进行dotnet publish -r centos.7-x -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-x/publish,包含self.exe)上传到Linux root目录下project(新建)文件夹中, 在Shell中输入指令
修改可执行权限后,即可成功运行“Hello World”,这就是我们“Self-contained applications”方式的部署方法
至此,.NET Core的学习便告一段落了,以上内容简单介绍了.NET Core的组成和特性,同时也在Windows和Linux系统上通过两种不同的部署方式成功运行了示例。相比较之前的.NET Framework傻瓜式部署,.NET Core的新奇真是让我眼前一亮。接下来,我也会将.NET Core和 ASP.NET Core的学习记录下来,欢迎指正。
4.2 相关学习资料
5. 参考资料
visual studio社åºçåä¼ä¸ççåºå«
åºå«å¦ä¸ï¼1ã 社åºç(Visual Studio Community )å¯ä¾éä¼ä¸æå¼æºå¼åè 们å 费访é®ï¼
2ãä¸ä¸ç(Visual Studio Professional with MSDN)æä¾çå·¥å ·åæå¡éåæ´ä¸ºå®æ´ï¼ç¬ç«å¼åè åå¼åå¢éå¯åæ¤è¿ä¸æ¥æåç产ååæé ä¸ä¸çº§çåºç¨ç¨åºï¼
3ãä¼ä¸ç(Visual Studio Enterprise with MSDN)åæ¯æ´åäºé«çº§ç(Visual Studio Premium)åæè°ç(Visual Studio Ultimate)åçææ°çæ¬ã
æ»ç»:
å®ä»¬ä¸ºå¢éæä¾äºå¤§è§æ¨¡åºç¨ç¨åºåæå¡æ¹é¢çä¸é¨ä¼åï¼å å«äºæè°çä¸ææé«ä»·å¼çåè½ï¼å¹¶ä¸å å ¥äºæ´å¤åæ°å 容ã
æ©å±èµæ
1ãMicrosoft Visual Studioï¼ç®ç§°VSï¼æ¯ç¾å½å¾®è½¯å ¬å¸çå¼åå·¥å ·å ç³»å产åãVSæ¯ä¸ä¸ªåºæ¬å®æ´çå¼åå·¥å ·éï¼å®å æ¬äºæ´ä¸ªè½¯ä»¶çå½å¨æä¸æéè¦ç大é¨åå·¥å ·ï¼å¦UMLå·¥å ·ã代ç 管æ§å·¥å ·ãéæå¼åç¯å¢(IDE)ççã
2ãæåçç®æ 代ç éç¨äºå¾®è½¯æ¯æçææå¹³å°ï¼å æ¬Microsoft WindowsãWindows MobileãWindows CEã.NET Frameworkã.NET Compact FrameworkåMicrosoft Silverlight åWindows Phoneã
3ãVisual Studioæ¯ç®åææµè¡çWindowså¹³å°åºç¨ç¨åºçéæå¼åç¯å¢ãææ°çæ¬ä¸º Visual Studio çæ¬ï¼åºäº.NET Framework 4.5.2 ã
åèèµææ¥æºï¼å¾®è½¯visualstudioå®ç½
C# 9 新功能“源代码生成器”,你用了吗?
C# 9.0 的新特性——源代码生成器,已经悄然融入.NET 5,它能根据已有代码的特定条件自动生成可重复的代码。这种无感知的代码生成过程,通过嵌入编译器,简化了开发者的工作流程,减少了代码重复和错误。
在实际开发中,我们常常需要重写代码以满足新需求,如实现相等判断和ToString()方法。以前,这可能需要费时且容易出错,但现在,C# 9.0引入的record类型和特性如[Equaltable],能够自动处理这些任务。例如,record类型的类会自动实现相等方法,而[ToString]特性则能帮助生成高效且可读的字符串表示。
源代码生成器不仅用于简单地生成相等和ToString方法,它还能应用于高性能场景,flash照片墙 源码如通过反射实现ToString()会带来性能损失。通过源代码生成器,我们可以创建高性能的ToString实现,无需依赖反射,从而提高代码效率。
源代码生成器并非全新的概念,但它在C# 9.0中变得更强大,它允许开发人员在编译时动态创建代码,这在Roslyn Examples、StrongInject、ThisAssembly和Rocks等众多应用中得到了体现。通过这些例子,源代码生成器可以自动化处理如IPropertyNotifyChanged、IoC容器配置、组件信息公开和测试mocks等复杂任务,极大地提升了开发效率和代码质量。
总的来说,源代码生成器是C# 9.0中的一项革新,它让开发者能够更轻松、高效地编写重复代码,减少了手动工作,提高了开发者的生产力。不妨试试这个新功能,你可能会发现编程的乐趣被放大了无数倍!
一个开源轻量级的C#代码格式化工具(支持VS和VS Code)
在C#编程世界中,除了广受欢迎的ReSharper和CodeMaid,还有一款备受瞩目的开源工具——CSharpier。这款轻量级的代码格式化工具,凭借其.NET开源背景和MIT License的免费使用许可,为C#开发者提供了额外的格式化选项。
CSharpier的核心功能在于使用Roslyn解析代码,然后根据其定制的规则对代码进行精美的重构和格式化。它兼容多种IDE,包括Visual Studio 和、Visual Studio Code以及Rider等,使得开发者无论在哪个平台上都能享受一致的vb源码 sscom调试代码美化体验。
想要在Visual Studio 中体验CSharpier,只需打开扩展管理,搜索并安装即可。通过这款工具,你将见证代码格式化前后的鲜明对比,提升代码的可读性和整洁度。
如果你对C#项目源码和更多实用功能感兴趣,可以直接访问其开源地址,别忘了为项目点赞支持,让更多开发者共同参与和贡献。CSharpier已经成功入选C#/.NET/.NET Core的优秀项目和框架精选,这里是你了解最新技术和最佳实践的窗口,也是贡献自己项目和框架的好平台。
最后,如果你是C#编程的爱好者,加入我们的技术交流群,或关注我们的公众号——dotNet编程大全,一起分享和学习编程的点滴,不断进步,共同成长。记住,每天的进步虽小,但日积月累,必将成就卓越的开发者之路!
怎么看待rust体系中rowan的红绿树?
在讨论 Rust 体系中的 Rowan 红绿树之前,我们先理解 Roslyn 作为编译器项目的目标。Roslyn 设计的初衷是提供优雅的 API,并追求高性能。在这一背景下,Roslyn 的开发者团队面临挑战,即在描述如 C# 这样的语言语法时,找到符合需求的特殊数据结构。这个数据结构需满足以下几点:不可变性、树形结构、便捷的父子节点访问、容易对应源代码文本区间以及可重用性。实现中,一个常见需求是编译器错误信息能够明确指出错误源代码的行与列。以表达式 "1 + 2" 的语法树为例,通过数据结构描述其结构。然而,当源代码中添加额外空格,如 "1 + 2 "(这里的空格显示受限于知乎平台),语法树会受到影响。这表明在实际应用中,语法无关的修改不应导致语法树的结构变化。
为解决这一问题,可以设计语法树的节点不包含 offset 信息。然而,这样做会导致无法通过节点对应源代码文本区间。另一种方法是将空格与注释等非语法元素也包含在语法树中,确保所有源代码信息被完整保留。Rowan 作为 Rust-analyzer 的核心库,强调构建无损语法树,即保留源代码所有信息,包括空格与注释。通过这种设计,语法树中的节点能够共享,如在表达式 "1 + 1" 中的两个 "1" 节点,表明了“可重用”特性。
将 Rowan 的数据结构应用于语言服务协议(LSP)中,可以提高语言增量解析和构建效率。在 LSP 中实现代码自动补全功能时,如果发现计算结果与前次一致,无需重新计算,可直接使用缓存结果。例如,仅添加空格不影响语法树结构,后续的抽象语法树(AST)构建和类型检查等步骤可利用缓存,节省计算资源。
Rowan 中的“红树”主要解决访问父节点的问题,同时提供更简便的节点 offset 计算方法。在实现上,“红树”维护指向“绿树”节点的指针或引用,构建过程无需进行深拷贝,减少开销。关于“不可变”这一点,Rowan 数据结构确保了数据的不可变性,但其具体实现细节需由熟悉 Rust 的开发者深入分析。
总的来说,Rowan 红绿树设计旨在优化编译器与语言服务功能,通过高效的数据结构管理和优化计算流程,提高开发效率和用户体验。对于“红树”与“绿树”之间的区别与实现细节,感兴趣的读者可参考 Rust-analyzer 开发者在 YouTube 上的讲解视频,以获取更深入的理解。
C# Roslyn动态生成代码
使用Roslyn进行编译代码需要下载 Roslyn 库。这个库会在运行时造成很大的影响,因为你在打包运行编译器所需的所有库。通常,典型发行版运行时在一个已部署的应用程序中占用约mb的空间。
在使用Roslyn进行代码编译时,最小编译单元是创建c#类型,通常是类。这意味着为了运行一个代码片段,你需要创建一个类和方法来包装该代码片段或表达式。首先,你需要从源代码创建一个语法树,这是Roslyn编译代码所需要的。语法树包含解析过的c#代码,这些代码将源代码分解为每个操作。编译器使用这种语法树进行编译,代码分析器也可以使用这种语法树来检查代码,并根据可用的见解创建工具。
接下来,你需要创建Compilation(类实例),它实际上是分配语法树,以及设置编译器的一系列设置。大多数选项都是默认的,工作得很好,但至少你需要提供你的依赖作为汇编元数据引用。创建引用的复杂性隐藏在下面描述的AddXXX()方法中。
在编译代码时,你需要添加每个引用的依赖项。这意味着必须显式添加外部库和隐式添加系统库。需要哪些依赖并不总是显而易见的,尤其是涉及到.net Core中的框架库时。每个引用类型都需要作为MetaDataReference提供,与程序集不同,它只包含它们的依赖元数据。这些引用从磁盘上的程序集文件(assembly.location)加载,或者从预先存在的元数据库或任何流加载。除非你使用显式引用程序集(没有在框架运行时中附带),这通常意味着你必须从程序集文件位置加载,并且你需要一个完整的路径才能使用MetadataReference.CreateFromFile(file)。这是一种痛苦,因为路径必须解决。
为了帮助创建这些引用,最好创建两个帮助程序,它们可以从文件或类型中解析MetaDataReference,并创建所有或大多数应用程序需要的程序集的默认列表。
在编译代码时,你需要理解每个引用类型都需要作为MetaDataReference提供,与程序集不同,它只包含它们的依赖元数据。每个引用类型都需要从磁盘上的程序集文件(assembly.location)加载,或者从预先存在的元数据库或任何流加载。除非你使用显式引用程序集(没有在框架运行时中附带),这通常意味着你必须从程序集文件位置加载,并且你需要一个完整的路径才能使用MetadataReference.CreateFromFile(file)。
在编译代码时,你还需要添加额外的引用。可以使用ScriptOptions对象来添加额外的引用,或者通过使用r#指令和要加载的程序集的完整路径,直接将脚本引用添加到代码中。
在加载和执行编译后的代码时,你需要使用反射来加载编译后的类型。结果将是一个对象引用,使用它的最简单方法是使用dynamic。你可以通过其他方式使用这个类型,无论哪种方式,执行检索到的代码都很容易。
在编译过程的性能方面,代码编译并不快,在性能方面有一些事情需要考虑。Roslyn的启动性能是一个大问题,因为Roslyn库很大,在加载时间和内存使用方面都会产生巨大的资源消耗。然而,随后的编译速度要快得多,对于小代码块,运行时间在-ms之间。但是,编译和脚本执行周期肯定不会很快。有一些方法可以通过缓存来缓解这个问题,但如何设置并不是很明显。
Roslyn Scripting APIs 包括一个脚本API,通过让您只运行一小段代码或单个表达式,而不必首先手动创建一个类,从而简化了这个过程。在幕后,代码仍然生成一个类和程序集,但是使用脚本API时,这是隐藏的,因此您只需传入一个代码片段。然而,脚本API也有一些限制,包括没有非异步运行的支持、没有全局对象、没有默认的缓存策略和没有文档。
.cs是什么文件
.cs 文件是 C# 编程语言的源代码文件,扩展名为 .cs。C# 是一种面向对象的编程语言,由 Microsoft 开发并在 .NET 平台上使用。在 Visual Studio 等 IDE 中,开发者可以创建、编辑和管理 .cs 文件。
编辑 .cs 文件通常需要文本编辑器或 IDE。常用工具包括 Visual Studio、Visual Studio Code、Notepad++ 和 Sublime Text。这些工具支持语法高亮、自动完成等功能,可提高编程效率。
编译 .cs 文件的常见编译器有 Microsoft C# 编译器、Mono C# 编译器和 Roslyn C# 编译器。Microsoft C# 编译器是官方编译器,支持在 .NET Framework 和 .NET Core 中使用。Mono C# 编译器是一个开源编译器,可在多个平台使用。Roslyn C# 编译器提供了更丰富的编程分析和重构功能。SharpDevelop IDE 也内置了自己的 C# 编译器,支持多种 C# 特性。
选择合适的工具和编译器,可以更高效地编写、编辑和编译 C# 代码。