c#
文章平均质量分 83
你一身傲骨怎能输
大家好,我是傲骨,一名热爱游戏开发,曾任多家游戏初创公司技术负责人,现在大厂打螺丝,我拥有计算机科学和应用数学学士学位,并在游戏行业工作了超过10年。我参与过多个独立游戏项目,从概念设计到发布,积累了丰富的实践经验。大学期间参与多项创新创业项目,斩获省赛大奖。喜欢用技术和创意打造不一样的世界,分享真实的成长、实用的策略和学习心得。
座右铭:“用代码点燃梦想,用行动改变未来!”
关注我,不错过每一场关于成长与梦想的实战分享!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
编程中的反射技术——用 C# 框架级自动化玩转插件案例全流程(大白话万字详解)
本文通过一个C#插件系统案例,详细讲解了反射技术在框架级自动化中的应用。主要内容包括: 反射原理:程序运行时动态获取类型信息的能力 框架自动化:通过注解扫描和自动装配实现插件自动加载 案例实现: 定义PluginAttribute标记插件类 创建IPlugin统一接口 使用反射扫描DLL并实例化插件 自动调用插件功能 扩展应用: 依赖注入实现插件间解耦 类似ASP.NET Core的自动装配原理 支持热插拔的插件系统设计 该方案通过反射实现了零配置的插件自动化管理,显著提升了系统的扩展性和维护性,为框架级开原创 2025-12-03 22:46:36 · 957 阅读 · 0 评论 -
揭秘编程反射技术:从原理到实战全解析
编程反射技术算法实现过程摘要 本文深入浅出地讲解了编程反射技术的核心原理与实现算法。反射是一种让程序在运行时动态检查自身结构、创建对象、访问属性和调用方法的能力,广泛应用于框架开发、依赖注入等场景。文章从反射的底层原理出发,详细解析了元数据结构在Java、C#等语言中的实现方式,并系统梳理了反射算法的五大核心流程:类查找与元信息解析、对象实例化、属性操作、方法调用和注解解析。通过Java和Python的代码示例,展示了反射API的具体实现细节,包括内存管理、类型转换等关键技术点。最后讨论了反射的性能优化策略原创 2025-12-03 22:20:16 · 319 阅读 · 0 评论 -
深入浅出:沙箱机制实战指南
沙箱机制是一种受限执行环境,用于安全运行不信任代码。本文用通俗语言和代码示例讲解其原理和实现: 沙箱本质是为代码设置"游乐区"边界,限制资源访问,防止恶意破坏系统或窃取数据。常见于在线代码执行、插件平台、云函数等场景。 实现原理包括权限控制(限制文件/网络访问)、资源隔离(独立内存/进程)和执行限制(CPU/内存约束)。典型实现方式有语言级沙箱(JVM/.NET)、操作系统级(Docker/chroot)、进程隔离等。 .NET示例通过AppDomain+PermissionSet创建沙原创 2025-11-17 16:38:47 · 416 阅读 · 0 评论 -
CLR沙箱执行安全机制:保护.NET代码的安全护栏
CLR沙箱执行安全机制:保护.NET代码的安全护栏 CLR沙箱是.NET程序的安全执行环境,用于限制第三方代码(如插件、脚本)的权限,防止其越权访问系统资源。核心原理包括: 权限控制:通过PermissionSet定义代码可执行的操作(如文件读写、网络访问),未授权的操作将被CLR阻止。 域隔离:利用AppDomain隔离主程序和沙箱代码,沙箱域仅能访问有限资源,跨域通信需严格校验。 典型应用场景包括插件系统、业务脚本引擎和云服务代码托管,需注意以下风险: 权限配置过宽可能使沙箱失效。 跨域通信未校验可能导原创 2024-12-31 20:04:29 · 248 阅读 · 0 评论 -
深入剖析C# int转byte[]的底层原理
摘要:本文深入剖析C#中int转byte[]的底层原理,通过BitConverter、位运算、指针等方法实现数据类型转换。关键点包括:int在内存中的4字节存储结构、大小端字节序的影响、网络传输中的字节序处理,以及不同转换方法的性能与安全考量。文章以生动案例解析底层内存操作,帮助开发者理解数据在网络和跨平台场景下的二进制表现形式,并提供了实用的实现方案和注意事项。原创 2018-05-02 14:17:44 · 1005 阅读 · 0 评论 -
彻底搞懂C#之Yield Return语法的作用和好处——从底层实现到工程应用,“懒人神器”真面目
摘要: C#的Yield Return语法是高效处理大数据集的核心利器。本文深入剖析其底层机制与工程价值,揭示编译器如何将简洁的yield return语句转化为复杂的状态机实现,实现"按需产出"的迭代模式。通过快递分批配送、薪资按月发放等生活类比,阐释延迟执行的核心理念;结合斐波那契数列生成、数据库分页查询等代码案例,展示其节省内存(处理GB级数据时内存占用可降低99%)、提升响应速度的优势。源码级分析表明,每个yield块会被编译为包含switch状态机的迭代器类,自动维护上下文状态原创 2017-11-08 21:15:34 · 6426 阅读 · 1 评论 -
内存映射文件:大文件的窗口化魔法
摘要: 内存映射文件(MemoryMappedFile)通过操作系统虚拟内存机制,将磁盘文件映射为内存地址空间,实现高效的大文件访问。核心思想是“窗口化”——仅加载所需数据块(如4KB页),避免将超大文件整体读入内存。其优势包括: 性能提升:减少系统调用,利用CPU直接访问内存指令; 简化代码:像操作数组一样读写文件; 大文件支持:通过滑动窗口或分段映射处理远超内存的文件(如50GB日志); 多进程共享:实现高效数据协作。 需注意同步、资源释放等陷阱,适用于数据库、科学计算等场景。典型实现如Python的m原创 2017-11-16 23:28:16 · 3418 阅读 · 0 评论 -
深入理解C#中的static:共享与风险
C#中的static关键字用于声明属于类型本身而非实例的成员,如同公共储物柜供所有人共享。本文从基本概念入手,解释static成员、静态类和构造器的特性,并通过代码示例展示其在工具类、全局配置和泛型中的应用。文章详细分析了static的优点(简化访问、性能优化)和风险(全局状态、线程安全),特别针对游戏开发提供了使用建议,如合理应用于全局配置、对象池等场景,并给出避免反模式的工程实践指南。最后强调要在便利性与安全性之间取得平衡,正确管理这一强大工具。原创 2017-10-29 14:59:57 · 5027 阅读 · 0 评论 -
泛型类、泛型方法与代码包体膨胀的背后:一场类型魔法的生动技术揭秘
泛型代码包体变大的本质,其实和工厂自动“批量个性定制”一样。你本来希望有台万能机,可以服务所有客户,但为了每位客户的特殊需求,工厂不得不单独为客户打造专属机型、填补额外说明书、维护专用配置表,结果整个仓库空间——也就是你的软件包体——越来越庞大。泛型技术带来的类型安全与高适用性,是现代编程的福音,但它的实现需要占用更多代码体量,为每个“定制类型”存储更多元数据和支持逻辑,成为影响最终安装包或编译包体积的关键要素之一。原创 2025-10-06 20:57:30 · 870 阅读 · 0 评论 -
iOS编译与安全:Mono、IL2CPP与内存保护解析
本文对比分析了iOS平台下的两种AOT编译方案——Mono AOT和IL2CPP,并深入探讨了iOS禁止JIT的内存保护机制。Mono AOT将IL代码提前编译为机器码,而IL2CPP则转换为C++代码再编译,两者都规避了运行时代码生成。iOS通过内核级的mmap/mprotect限制、代码签名验证和DEP机制,严格禁止可执行内存的分配与修改,确保所有代码必须预先签名。这些安全措施使得Emit/Reflection.Emit等动态代码生成功能在iOS上不可用,但保留了基本的反射调用能力。该机制从系统和硬件层原创 2025-06-02 00:05:58 · 1271 阅读 · 0 评论 -
C#黑科技:运行时秒造新类型
摘要 C#的Emit技术(System.Reflection.Emit)实现了运行时动态代码生成,如同"万能制造机"可即时创建新类型、方法和程序集。其核心是通过AssemblyBuilder等API描述需求,CLR动态生成IL代码并即时编译,性能接近手写代码。典型应用包括:1)ORM框架的实体映射(如Entity Framework);2)序列化库(如Json.NET);3)AOP框架(如DynamicProxy)。Emit为高性能场景提供了底层支持,是反射技术的进阶应用,通过IL指令(原创 2024-11-30 19:29:55 · 300 阅读 · 0 评论 -
揭秘C#反射API:家电说明书操作指南
摘要: 反射API的工作流程比喻为“使用说明书操作家电”:1)获取对象(家电);2)查询类型元数据(说明书);3)定位方法/属性(查找按钮旋钮);4)通过MethodInfo/PropertyInfo调用(按说明书操作)。实际代码中,先获取对象类型,再反射查找成员信息并调用。底层通过查询程序集元数据,由CLR完成类型转换和执行。整个过程实现了动态查找和调用未知对象成员的功能。原创 2024-11-30 23:45:47 · 283 阅读 · 0 评论 -
闭包:带钥匙的临时工,小心内存泄漏
摘要:闭包就像带着钥匙的临时工,即使函数执行结束,仍能保留外部变量。这可能导致内存泄漏风险,就像临时工带走仓库钥匙(引用大对象)使得仓库无法清空(内存无法释放)。要避免这个问题,应只引用必要变量,用完及时解除闭包引用(将闭包置为null),防止长期占用内存。关键点:闭包会保留变量引用,不恰当使用可能造成内存泄漏。原创 2024-11-30 23:47:06 · 173 阅读 · 0 评论 -
匿名函数:代码界的无名厨师,用完即走
匿名函数就像一个“无名小厨师”,无需命名即可完成临时任务。它的本质是没有名字的函数,可以像变量一样传递和使用,常用于回调、集合操作和事件监听等场景。匿名函数在不同语言中有不同实现方式,如JavaScript的函数表达式、Python的lambda表达式等。它让代码更灵活简洁,特别适合一次性任务,无需定义完整的命名函数。原创 2024-11-30 23:47:51 · 222 阅读 · 0 评论 -
C# Attribute 在unity游戏开发中的应用
C# 的 Attribute(特性)在 Unity 游戏开发中有着非常广泛和重要的应用。它不仅仅是 C# 语言的语法糖,更是 Unity 编辑器、序列化、Inspector 展示、脚本生命周期等诸多系统的基础。下面详细介绍 C# Attribute 在 Unity 中的常见应用场景和原理。1.2 作用:让 public 字段不在 Inspector 面板显示,但仍然被序列化。示例:1.3 作用:让 public 字段不被 Unity 序列化(C# 标准特性)。示例:2. 自定原创 2024-11-13 23:54:59 · 183 阅读 · 0 评论 -
CIL静态方法的调用和参数传递过程
静态方法:只需压参数,直接call。实例方法:先压this,再压参数,通常用callvirt(即使不是虚方法)。参数索引:实例方法的ldarg.0是this,ldarg.1才是第一个声明参数。原创 2025-04-17 02:35:41 · 399 阅读 · 0 评论 -
CIL常用操作码速查表
下面我帮你把CIL常用操作码(Opcode)做一个,并补充简要说明,方便查阅和理解。原创 2025-04-17 02:31:31 · 764 阅读 · 0 评论 -
为什么说CIL的VM(mono运行时)是一个栈式机
栈式虚拟机(Stack-based VM)指的是指令的操作数主要通过操作数栈(Operand Stack)来传递和处理。CIL(Common Intermediate Language)就是典型的栈式指令集。每条指令通常会把数据压入栈(push),或者从栈顶弹出数据(pop)进行操作。CIL是栈式虚拟机,所有操作都围绕操作数栈进行。这样设计让CIL与CPU架构无关,易于实现,适合多语言编译和跨平台。只有在JIT/AOT编译为本地代码时,才会根据目标CPU架构把栈操作映射到寄存器或内存。原创 2025-04-17 02:23:52 · 330 阅读 · 0 评论 -
CLR是如何解决跨语言编程类型不兼容问题的
CLR通过统一的类型系统、类型映射、显式和隐式转换、类型安全和运行时检查、反射和元数据、运行时类型信息、语言互操作性以及标准库和工具支持等多种机制,有效地解决了跨语言编程中的类型不兼容问题。这些机制确保了不同语言之间的类型能够安全、有效地互操作,从而提高了开发效率和程序的稳定性。原创 2025-04-09 11:02:26 · 392 阅读 · 0 评论 -
谈谈如果没有这种统一性确保了不同语言中的浮点类型能够正确映射到CLR的标准类型的话面临的问题和挑战
如果没有统一性确保不同语言中的浮点类型能够正确映射到CLR的标准类型,可能会导致类型不兼容、数据丢失、运行时错误和开发复杂性等问题。通过制定明确的类型规范、提供类型转换库、进行运行时类型检查、使用中间表示以及提供教育和文档,可以有效地解决这些问题,确保不同语言之间的类型能够安全、有效地互操作。原创 2025-04-09 10:59:47 · 336 阅读 · 0 评论 -
谈谈统一的类型系统中的类型映射功能
CTS定义了一组标准的基本数据类型,每种类型都有明确的位数和行为。例如,CTS中定义的单精度浮点数是,它始终占用32位(4字节)。无论在C#、VB.NET还是其他.NET语言中,单精度浮点数的定义都是一致的。CTS通过定义统一的类型标准、关注类型的语义、提供类型安全性和运行时支持,确保了不同编程语言之间的基本类型能够正确地映射和互操作。即使在某些情况下,基本类型的位数可能不同,CTS的设计仍然能够确保类型的一致性和安全性,从而避免潜在的错误和不兼容问题。原创 2025-04-09 10:49:01 · 603 阅读 · 0 评论 -
公共类型系统(CTS,Common Type System)
公共类型系统(CTS)是.NET框架的核心组成部分,它定义了所有.NET语言中可以使用的基本数据类型和对象类型。通过提供统一的类型系统,CTS实现了不同编程语言之间的互操作性,确保类型安全,并支持类型的继承、接口和泛型等特性。理解CTS的工作原理对于开发高效、安全的.NET应用程序至关重要。通过CTS,开发者可以充分利用不同语言的优势,构建功能丰富、灵活且可扩展的应用程序。原创 2025-04-09 10:47:08 · 394 阅读 · 0 评论 -
CLR与.NET框架的关系
CLR是.NET框架的核心,提供了执行、管理和优化.NET应用程序所需的基础设施。它负责将中间语言(IL)代码转换为机器代码,并提供内存管理、类型安全、异常处理、安全性、反射和多线程支持等功能。理解CLR的工作原理和功能,对于开发高效、安全的.NET应用程序至关重要。通过CLR,开发者可以专注于业务逻辑,而不必过多关注底层的实现细节。语言互操作性语言互操作性是CLR的一项关键特性,它通过支持多种编程语言和提供统一的类型系统(CTS)来实现不同语言之间的无缝协作。原创 2025-04-09 10:25:50 · 885 阅读 · 0 评论 -
大白话彻底讲明白:CLR里的类型信息(Type Metadata)就是程序的“户口本”
CLR中的类型信息(Type Metadata)是程序的"户口本",记录了每个类型的详细特征,包括名称、字段、方法、继承关系等关键数据。文章首先用大白话解释了类型信息的概念,通过Student类的例子展示其包含的内容。然后深入剖析了类型信息在CLR中的存储位置(程序集元数据区)和使用场景(CLR自身、开发者、工具等)。接着详细列举了类型信息的完整内容构成,从类型身份到成员详情再到安全声明。通过大量C#代码示例,演示了如何通过System.Type类进行反射操作,包括查看元数据、动态创建对原创 2024-12-31 20:02:37 · 215 阅读 · 0 评论 -
谈谈值类型的装箱和拆箱发生的原理
装箱是将值类型转换为引用类型的过程,涉及内存分配和值复制。虽然装箱在某些情况下是必要的,但它会带来性能开销,因此在性能敏感的代码中,应尽量避免不必要的装箱。使用泛型和合适的数据结构可以有效减少这些开销。拆箱是将装箱的值类型从引用类型中提取回值类型的过程,涉及类型检查和值复制。虽然拆箱在某些情况下是必要的,但它会带来性能开销,因此在性能敏感的代码中,应尽量避免不必要的拆箱。使用泛型和合适的数据结构可以有效减少这些开销。内存分配:装箱需要在堆上分配内存,速度比栈上分配慢。垃圾回收。原创 2025-03-29 23:19:07 · 807 阅读 · 0 评论 -
c#特性(Attributes)
开发者可以创建自己的特性。自定义特性需要继承自类,并可以添加构造函数和属性。属性:用于封装类的字段,提供安全的访问方式。特性:用于为程序元素添加元数据,可以在运行时通过反射访问。自定义特性:开发者可以创建自己的特性,以满足特定需求。这两个概念在 C# 编程中非常重要,能够帮助开发者更好地组织代码和提供额外的信息。原创 2025-03-22 20:02:51 · 143 阅读 · 0 评论 -
应用程序域(AppDomain)
定义应用程序域是一个轻量级的进程内隔离环境,用于执行 .NET 应用程序。每个应用程序域都有自己的代码、数据和配置,允许在同一进程中安全地运行多个应用程序。隔离性应用程序域提供了类型安全和内存隔离。一个应用程序域中的代码无法直接访问另一个应用程序域中的对象,这有助于提高安全性和稳定性。应用程序域是 .NET Framework 中用于隔离和管理应用程序的重要机制。它提供了代码隔离、安全性、资源管理和动态卸载等功能,使得在同一进程中运行多个应用程序变得更加安全和高效。原创 2025-03-17 23:44:50 · 250 阅读 · 0 评论 -
可执行文件(如 .exe)解析原理
可执行文件的解析过程是一个复杂的机制,涉及文件格式的解析、内存的分配和管理、指令的执行以及资源的管理。理解这一过程对于开发和调试应用程序、优化性能以及处理异常至关重要。通过深入了解可执行文件的解析原理,开发者可以更好地利用操作系统提供的功能。原创 2025-03-17 23:45:20 · 962 阅读 · 0 评论 -
加载和执行
CLR 的加载和执行过程是一个复杂而高效的机制,涉及程序集的加载、IL 代码的验证、即时编译为机器代码以及最终的执行。通过这些步骤,CLR 确保 .NET 应用程序能够在特定的操作系统和硬件上高效、安全地运行。理解这一过程对于优化和调试 .NET 应用程序至关重要。原创 2025-03-17 23:45:51 · 136 阅读 · 0 评论 -
跨平台执行
跨平台执行是 .NET 的一大优势,特别是在 .NET Core 和 .NET 5 及更高版本中,开发者可以在多种操作系统上运行相同的代码。通过将 IL 代码转换为特定平台的机器代码,CLR 使得 .NET 应用程序能够在不同的硬件和操作系统上无缝运行。这种跨平台能力不仅提高了开发效率,还为开发者提供了更大的灵活性和选择空间。原创 2025-03-17 23:46:22 · 463 阅读 · 0 评论 -
执行机器代码
在 CLR 中,执行机器代码的过程是一个复杂而高效的机制,涉及方法调用的管理、线程的调度与同步、异常处理和内存管理等多个方面。通过这些机制,CLR 确保 .NET 应用程序能够高效、安全地运行,同时为开发者提供了丰富的工具和功能,以便于构建复杂的应用程序。理解这些执行过程对于优化和调试 .NET 应用程序至关重要。原创 2025-03-17 23:47:27 · 152 阅读 · 0 评论 -
加载器(Loader)
加载器在 CLR 中扮演着至关重要的角色,负责将 IL 代码和元数据加载到内存中,并确保所有依赖程序集都已正确解析和加载。通过创建应用程序域,加载器为应用程序提供了一个隔离的执行环境,允许多个应用程序在同一进程中安全地运行。理解加载器的工作原理对于开发和调试 .NET 应用程序至关重要,能够帮助开发者更好地管理程序集和资源。原创 2025-03-17 23:48:01 · 323 阅读 · 0 评论 -
执行 程序
在 JIT 编译后,CLR 开始执行机器代码,程序的主入口点(通常是Main方法)被调用,程序开始运行。在执行过程中,CLR 负责管理线程、处理异常、进行垃圾回收等。通过这些机制,CLR 确保 .NET 应用程序能够高效、安全地运行,同时提供了丰富的功能支持,帮助开发者构建复杂的应用程序。理解这些执行过程对于优化和调试 .NET 应用程序至关重要。原创 2025-03-17 23:48:32 · 132 阅读 · 0 评论 -
JIT 编译
JIT 编译是 .NET CLR 中将 IL 代码转换为机器代码的关键过程。通过在方法首次调用时进行编译并缓存结果,JIT 编译器能够提高应用程序的执行效率,同时保持平台无关性。尽管 JIT 编译在首次调用时可能引入延迟,但其动态优化能力和与 CLR 的紧密集成使其成为 .NET 应用程序执行的核心组成部分。理解 JIT 编译的工作原理对于优化 .原创 2025-03-17 23:49:03 · 283 阅读 · 0 评论 -
验证和准备
验证和准备是 CLR 加载和执行 IL 代码的重要步骤。通过类型安全检查和安全性检查,CLR 确保代码在执行时不会导致类型错误或安全漏洞。随后,经过验证的代码会被 JIT 编译为本地机器代码,并在运行时进行监控,以确保应用程序的安全性和稳定性。理解这些过程对于开发安全和高效的 .NET 应用程序至关重要。原创 2025-03-17 23:50:45 · 141 阅读 · 0 评论 -
加载程序集
加载程序集是 CLR 初始化和执行 .NET 应用程序的关键步骤。通过加载主程序集和所有依赖的程序集,CLR 确保所有类型和方法都能正确找到,并提供了必要的运行时环境。理解程序集的加载过程对于开发和调试 .NET 应用程序至关重要,能够帮助开发者更好地管理依赖关系、处理版本问题和优化性能。原创 2025-03-18 23:41:25 · 294 阅读 · 0 评论 -
初始化 CLR
初始化 CLR 是 .NET 应用程序执行过程中的关键步骤。通过设置执行环境、创建应用程序域、加载程序集和提供运行时服务,CLR 为 .NET 应用程序提供了一个安全、高效的执行环境。这些初始化操作确保了应用程序能够在受控的环境中运行,支持多线程和跨应用程序域的交互,从而提高了应用程序的稳定性和安全性。理解 CLR 的初始化过程对于开发和优化 .NET 应用程序至关重要。原创 2025-03-18 23:42:00 · 146 阅读 · 0 评论 -
加载 CLR
CLR(公共语言运行时)是 .NET 平台的核心组件,负责管理 .NET 应用程序的执行。它提供了一系列服务,使得开发者可以专注于应用程序的逻辑,而不必过多关注底层的系统细节。类型安全:确保程序在运行时遵循类型规则,防止类型错误和不安全的操作。内存管理:通过垃圾回收(Garbage Collection, GC)自动管理内存,释放不再使用的对象,减少内存泄漏的风险。异常处理:提供统一的异常处理机制,使得开发者能够捕获和处理运行时错误。跨语言互操作性。原创 2025-03-18 23:42:39 · 136 阅读 · 0 评论 -
C# 程序启动过程
程序启动的过程是一个复杂的多步骤流程,涉及操作系统、CLR 和应用程序本身的紧密协作。通过这一过程,CLR 确保了 C# 程序的安全性、稳定性和跨平台能力,使得开发者能够专注于业务逻辑的实现,而不必过多担心底层的执行细节。原创 2025-03-28 01:03:55 · 543 阅读 · 0 评论 -
IL 代码加载和执行
加载和执行是 CLR 中至关重要的两个过程。通过加载 IL 代码,CLR 确保了程序的依赖关系和安全性;通过将 IL 代码转换为机器代码,CLR 使得 C# 程序能够在不同的环境中高效运行。这一机制不仅提高了程序的可移植性,还增强了开发者的生产力,使得 .NET 成为一个强大且灵活的开发平台。原创 2025-03-28 01:02:39 · 410 阅读 · 0 评论
分享