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中。也就是biubiuTV影视源码下载说,.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方法,它还能应用于高性能场景,起号云源码如通过反射实现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等,使得开发者无论在哪个平台上都能享受一致的突破波峰指标源码代码美化体验。
想要在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# 代码。