
c#
文章平均质量分 80
你一身傲骨怎能输
大家好,我是傲骨,一名热爱游戏开发的程序员,主要是游戏客户端研发方向。
我拥有计算机科学和应用数学学士学位,并在游戏行业工作了超过10年,专注于使用Unity和C#进行游戏开发。我参与过多个独立游戏项目,从概念设计到发布,积累了丰富的实践经验。
我会定期分享相关技术经验供大家学习和参考,已有的博客文章也会随着时间而逐渐更新与优化,我会尽量将每一篇文章写写满干货,让大家能阅读后有所收获,鉴于本人还在公司工作暂时不开启交流群,后期会逐渐开启交流群并且研发一些作品展示实战效果。对于一些购买我的技术专栏的表示感谢,感谢您的支持,一些专栏的文章会跟进公司项目实战经验不断的优化和更新,同时会替换掉烂文。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
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 · 1049 阅读 · 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 · 172 阅读 · 0 评论 -
揭秘C#反射API:家电说明书操作指南
摘要: 反射API的工作流程比喻为“使用说明书操作家电”:1)获取对象(家电);2)查询类型元数据(说明书);3)定位方法/属性(查找按钮旋钮);4)通过MethodInfo/PropertyInfo调用(按说明书操作)。实际代码中,先获取对象类型,再反射查找成员信息并调用。底层通过查询程序集元数据,由CLR完成类型转换和执行。整个过程实现了动态查找和调用未知对象成员的功能。原创 2024-11-30 23:45:47 · 238 阅读 · 0 评论 -
闭包:带钥匙的临时工,小心内存泄漏
摘要:闭包就像带着钥匙的临时工,即使函数执行结束,仍能保留外部变量。这可能导致内存泄漏风险,就像临时工带走仓库钥匙(引用大对象)使得仓库无法清空(内存无法释放)。要避免这个问题,应只引用必要变量,用完及时解除闭包引用(将闭包置为null),防止长期占用内存。关键点:闭包会保留变量引用,不恰当使用可能造成内存泄漏。原创 2024-11-30 23:47:06 · 128 阅读 · 0 评论 -
匿名函数:代码界的无名厨师,用完即走
匿名函数就像一个“无名小厨师”,无需命名即可完成临时任务。它的本质是没有名字的函数,可以像变量一样传递和使用,常用于回调、集合操作和事件监听等场景。匿名函数在不同语言中有不同实现方式,如JavaScript的函数表达式、Python的lambda表达式等。它让代码更灵活简洁,特别适合一次性任务,无需定义完整的命名函数。原创 2024-11-30 23:47:51 · 153 阅读 · 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 · 114 阅读 · 0 评论 -
CIL静态方法的调用和参数传递过程
静态方法:只需压参数,直接call。实例方法:先压this,再压参数,通常用callvirt(即使不是虚方法)。参数索引:实例方法的ldarg.0是this,ldarg.1才是第一个声明参数。原创 2025-04-17 02:35:41 · 358 阅读 · 0 评论 -
CIL常用操作码速查表
下面我帮你把CIL常用操作码(Opcode)做一个,并补充简要说明,方便查阅和理解。原创 2025-04-17 02:31:31 · 685 阅读 · 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 · 269 阅读 · 0 评论 -
PDB(Program Database)文件
PDB文件在调试过程中扮演着至关重要的角色,它提供了源代码与编译后代码之间的映射、符号信息和异常处理信息。通过使用PDB文件,开发者能够更有效地调试和分析程序,快速定位问题并提高开发效率。原创 2024-12-31 20:00:45 · 225 阅读 · 0 评论 -
CLR是如何解决跨语言编程类型不兼容问题的
CLR通过统一的类型系统、类型映射、显式和隐式转换、类型安全和运行时检查、反射和元数据、运行时类型信息、语言互操作性以及标准库和工具支持等多种机制,有效地解决了跨语言编程中的类型不兼容问题。这些机制确保了不同语言之间的类型能够安全、有效地互操作,从而提高了开发效率和程序的稳定性。原创 2025-04-09 11:02:26 · 354 阅读 · 0 评论 -
谈谈如果没有这种统一性确保了不同语言中的浮点类型能够正确映射到CLR的标准类型的话面临的问题和挑战
如果没有统一性确保不同语言中的浮点类型能够正确映射到CLR的标准类型,可能会导致类型不兼容、数据丢失、运行时错误和开发复杂性等问题。通过制定明确的类型规范、提供类型转换库、进行运行时类型检查、使用中间表示以及提供教育和文档,可以有效地解决这些问题,确保不同语言之间的类型能够安全、有效地互操作。原创 2025-04-09 10:59:47 · 303 阅读 · 0 评论 -
谈谈统一的类型系统中的类型映射功能
CTS定义了一组标准的基本数据类型,每种类型都有明确的位数和行为。例如,CTS中定义的单精度浮点数是,它始终占用32位(4字节)。无论在C#、VB.NET还是其他.NET语言中,单精度浮点数的定义都是一致的。CTS通过定义统一的类型标准、关注类型的语义、提供类型安全性和运行时支持,确保了不同编程语言之间的基本类型能够正确地映射和互操作。即使在某些情况下,基本类型的位数可能不同,CTS的设计仍然能够确保类型的一致性和安全性,从而避免潜在的错误和不兼容问题。原创 2025-04-09 10:49:01 · 569 阅读 · 0 评论 -
公共类型系统(CTS,Common Type System)
公共类型系统(CTS)是.NET框架的核心组成部分,它定义了所有.NET语言中可以使用的基本数据类型和对象类型。通过提供统一的类型系统,CTS实现了不同编程语言之间的互操作性,确保类型安全,并支持类型的继承、接口和泛型等特性。理解CTS的工作原理对于开发高效、安全的.NET应用程序至关重要。通过CTS,开发者可以充分利用不同语言的优势,构建功能丰富、灵活且可扩展的应用程序。原创 2025-04-09 10:47:08 · 281 阅读 · 0 评论 -
CLR与.NET框架的关系
CLR是.NET框架的核心,提供了执行、管理和优化.NET应用程序所需的基础设施。它负责将中间语言(IL)代码转换为机器代码,并提供内存管理、类型安全、异常处理、安全性、反射和多线程支持等功能。理解CLR的工作原理和功能,对于开发高效、安全的.NET应用程序至关重要。通过CLR,开发者可以专注于业务逻辑,而不必过多关注底层的实现细节。语言互操作性语言互操作性是CLR的一项关键特性,它通过支持多种编程语言和提供统一的类型系统(CTS)来实现不同语言之间的无缝协作。原创 2025-04-09 10:25:50 · 776 阅读 · 0 评论 -
谈谈元数据类型信息(Type Metadata)
类型信息(Type Metadata)在CLR中扮演着重要角色,支持类型检查、反射、内存管理等功能。通过理解类型信息的结构和应用场景,开发者可以在实际开发中有效利用反射和类型信息。通过反射,我们可以获取类型的详细信息,包括其名称、基类型、成员、属性、方法和接口等。这些类型信息(Type Metadata)在动态编程、ORM、序列化等场景中非常有用。理解如何获取和使用这些信息,可以帮助开发者编写更灵活和可扩展的代码。原创 2024-12-31 20:02:37 · 144 阅读 · 0 评论 -
CLR类型安全机制
类型安全是CLR提供的一项关键特性,通过在代码执行之前和运行时进行类型检查,确保代码的安全性和稳定性。类型安全不仅防止了类型错误,还提高了代码的可维护性,并增强了系统的安全性。通过限制对内存的直接访问和严格的类型转换检查,CLR有效地防止了缓冲区溢出等安全漏洞,从而为开发者提供了一个更安全的编程环境。原创 2024-12-31 20:03:47 · 115 阅读 · 0 评论 -
谈谈CLR提供的沙箱执行安全机制
沙箱执行是CLR提供的一种重要安全机制,通过在受限环境中运行不受信任的代码,限制其对系统资源的访问。沙箱通过权限集、代码域和运行时检查等机制,确保代码只能执行有限的操作,从而保护主机系统的安全性。这种机制在Web应用程序、浏览器插件和云服务等场景中得到了广泛应用,有效降低了潜在的安全风险。原创 2024-12-31 20:04:29 · 174 阅读 · 0 评论 -
谈谈值类型的装箱和拆箱发生的原理
装箱是将值类型转换为引用类型的过程,涉及内存分配和值复制。虽然装箱在某些情况下是必要的,但它会带来性能开销,因此在性能敏感的代码中,应尽量避免不必要的装箱。使用泛型和合适的数据结构可以有效减少这些开销。拆箱是将装箱的值类型从引用类型中提取回值类型的过程,涉及类型检查和值复制。虽然拆箱在某些情况下是必要的,但它会带来性能开销,因此在性能敏感的代码中,应尽量避免不必要的拆箱。使用泛型和合适的数据结构可以有效减少这些开销。内存分配:装箱需要在堆上分配内存,速度比栈上分配慢。垃圾回收。原创 2025-03-29 23:19:07 · 701 阅读 · 0 评论 -
c#特性(Attributes)
开发者可以创建自己的特性。自定义特性需要继承自类,并可以添加构造函数和属性。属性:用于封装类的字段,提供安全的访问方式。特性:用于为程序元素添加元数据,可以在运行时通过反射访问。自定义特性:开发者可以创建自己的特性,以满足特定需求。这两个概念在 C# 编程中非常重要,能够帮助开发者更好地组织代码和提供额外的信息。原创 2025-03-22 20:02:51 · 114 阅读 · 0 评论 -
应用程序域(AppDomain)
定义应用程序域是一个轻量级的进程内隔离环境,用于执行 .NET 应用程序。每个应用程序域都有自己的代码、数据和配置,允许在同一进程中安全地运行多个应用程序。隔离性应用程序域提供了类型安全和内存隔离。一个应用程序域中的代码无法直接访问另一个应用程序域中的对象,这有助于提高安全性和稳定性。应用程序域是 .NET Framework 中用于隔离和管理应用程序的重要机制。它提供了代码隔离、安全性、资源管理和动态卸载等功能,使得在同一进程中运行多个应用程序变得更加安全和高效。原创 2025-03-17 23:44:50 · 161 阅读 · 0 评论 -
可执行文件(如 .exe)解析原理
可执行文件的解析过程是一个复杂的机制,涉及文件格式的解析、内存的分配和管理、指令的执行以及资源的管理。理解这一过程对于开发和调试应用程序、优化性能以及处理异常至关重要。通过深入了解可执行文件的解析原理,开发者可以更好地利用操作系统提供的功能。原创 2025-03-17 23:45:20 · 484 阅读 · 0 评论 -
加载和执行
CLR 的加载和执行过程是一个复杂而高效的机制,涉及程序集的加载、IL 代码的验证、即时编译为机器代码以及最终的执行。通过这些步骤,CLR 确保 .NET 应用程序能够在特定的操作系统和硬件上高效、安全地运行。理解这一过程对于优化和调试 .NET 应用程序至关重要。原创 2025-03-17 23:45:51 · 105 阅读 · 0 评论 -
跨平台执行
跨平台执行是 .NET 的一大优势,特别是在 .NET Core 和 .NET 5 及更高版本中,开发者可以在多种操作系统上运行相同的代码。通过将 IL 代码转换为特定平台的机器代码,CLR 使得 .NET 应用程序能够在不同的硬件和操作系统上无缝运行。这种跨平台能力不仅提高了开发效率,还为开发者提供了更大的灵活性和选择空间。原创 2025-03-17 23:46:22 · 416 阅读 · 0 评论 -
执行机器代码
在 CLR 中,执行机器代码的过程是一个复杂而高效的机制,涉及方法调用的管理、线程的调度与同步、异常处理和内存管理等多个方面。通过这些机制,CLR 确保 .NET 应用程序能够高效、安全地运行,同时为开发者提供了丰富的工具和功能,以便于构建复杂的应用程序。理解这些执行过程对于优化和调试 .NET 应用程序至关重要。原创 2025-03-17 23:47:27 · 123 阅读 · 0 评论 -
加载器(Loader)
加载器在 CLR 中扮演着至关重要的角色,负责将 IL 代码和元数据加载到内存中,并确保所有依赖程序集都已正确解析和加载。通过创建应用程序域,加载器为应用程序提供了一个隔离的执行环境,允许多个应用程序在同一进程中安全地运行。理解加载器的工作原理对于开发和调试 .NET 应用程序至关重要,能够帮助开发者更好地管理程序集和资源。原创 2025-03-17 23:48:01 · 169 阅读 · 0 评论 -
执行 程序
在 JIT 编译后,CLR 开始执行机器代码,程序的主入口点(通常是Main方法)被调用,程序开始运行。在执行过程中,CLR 负责管理线程、处理异常、进行垃圾回收等。通过这些机制,CLR 确保 .NET 应用程序能够高效、安全地运行,同时提供了丰富的功能支持,帮助开发者构建复杂的应用程序。理解这些执行过程对于优化和调试 .NET 应用程序至关重要。原创 2025-03-17 23:48:32 · 104 阅读 · 0 评论 -
JIT 编译
JIT 编译是 .NET CLR 中将 IL 代码转换为机器代码的关键过程。通过在方法首次调用时进行编译并缓存结果,JIT 编译器能够提高应用程序的执行效率,同时保持平台无关性。尽管 JIT 编译在首次调用时可能引入延迟,但其动态优化能力和与 CLR 的紧密集成使其成为 .NET 应用程序执行的核心组成部分。理解 JIT 编译的工作原理对于优化 .原创 2025-03-17 23:49:03 · 169 阅读 · 0 评论 -
验证和准备
验证和准备是 CLR 加载和执行 IL 代码的重要步骤。通过类型安全检查和安全性检查,CLR 确保代码在执行时不会导致类型错误或安全漏洞。随后,经过验证的代码会被 JIT 编译为本地机器代码,并在运行时进行监控,以确保应用程序的安全性和稳定性。理解这些过程对于开发安全和高效的 .NET 应用程序至关重要。原创 2025-03-17 23:50:45 · 116 阅读 · 0 评论 -
加载程序集
加载程序集是 CLR 初始化和执行 .NET 应用程序的关键步骤。通过加载主程序集和所有依赖的程序集,CLR 确保所有类型和方法都能正确找到,并提供了必要的运行时环境。理解程序集的加载过程对于开发和调试 .NET 应用程序至关重要,能够帮助开发者更好地管理依赖关系、处理版本问题和优化性能。原创 2025-03-18 23:41:25 · 246 阅读 · 0 评论 -
初始化 CLR
初始化 CLR 是 .NET 应用程序执行过程中的关键步骤。通过设置执行环境、创建应用程序域、加载程序集和提供运行时服务,CLR 为 .NET 应用程序提供了一个安全、高效的执行环境。这些初始化操作确保了应用程序能够在受控的环境中运行,支持多线程和跨应用程序域的交互,从而提高了应用程序的稳定性和安全性。理解 CLR 的初始化过程对于开发和优化 .NET 应用程序至关重要。原创 2025-03-18 23:42:00 · 113 阅读 · 0 评论 -
加载 CLR
CLR(公共语言运行时)是 .NET 平台的核心组件,负责管理 .NET 应用程序的执行。它提供了一系列服务,使得开发者可以专注于应用程序的逻辑,而不必过多关注底层的系统细节。类型安全:确保程序在运行时遵循类型规则,防止类型错误和不安全的操作。内存管理:通过垃圾回收(Garbage Collection, GC)自动管理内存,释放不再使用的对象,减少内存泄漏的风险。异常处理:提供统一的异常处理机制,使得开发者能够捕获和处理运行时错误。跨语言互操作性。原创 2025-03-18 23:42:39 · 90 阅读 · 0 评论 -
C# 程序启动过程
程序启动的过程是一个复杂的多步骤流程,涉及操作系统、CLR 和应用程序本身的紧密协作。通过这一过程,CLR 确保了 C# 程序的安全性、稳定性和跨平台能力,使得开发者能够专注于业务逻辑的实现,而不必过多担心底层的执行细节。原创 2025-03-28 01:03:55 · 441 阅读 · 0 评论 -
IL 代码加载和执行
加载和执行是 CLR 中至关重要的两个过程。通过加载 IL 代码,CLR 确保了程序的依赖关系和安全性;通过将 IL 代码转换为机器代码,CLR 使得 C# 程序能够在不同的环境中高效运行。这一机制不仅提高了程序的可移植性,还增强了开发者的生产力,使得 .NET 成为一个强大且灵活的开发平台。原创 2025-03-28 01:02:39 · 363 阅读 · 0 评论 -
.NET 运行时环境(CLR)之类型安全
类型安全是 CLR 的一个核心特性,通过编译时和运行时的类型检查,确保了程序的类型一致性和安全性。它有效地避免了类型错误,提高了程序的稳定性和安全性,使得开发者能够更专注于业务逻辑的实现,而不必过多担心类型相关的问题。理解和利用类型安全机制是编写高质量 C# 代码的关键。原创 2025-03-28 00:57:53 · 737 阅读 · 0 评论 -
.NET 运行时环境(CLR)的主要职责以及组成
CLR 是 .NET 生态系统的核心,负责管理代码的执行、内存管理、安全性、异常处理等多个方面。通过提供这些功能,CLR 使得开发者能够专注于业务逻辑的实现,而不必过多关注底层的细节。理解 CLR 的职责和组成部分,有助于开发者更好地利用 .NET 平台的优势,编写高效、安全的应用程序。原创 2025-03-28 00:54:43 · 512 阅读 · 0 评论 -
C# 的编译过程
C# 的编译过程是将源代码转换为中间语言(IL)的关键步骤。通过 C# 编译器,开发者可以将 C# 源代码编译成可执行文件或类库文件,从而实现程序的运行。中间语言的设计使得 C# 程序具有良好的可移植性和跨平台能力,而编译后的文件类型则为程序的分发和使用提供了灵活性。理解编译过程对于 C# 开发者来说是非常重要的,有助于优化代码和解决潜在的问题。原创 2025-03-28 00:44:13 · 979 阅读 · 0 评论 -
使用 using 语句可以确保在使用完对象后自动调用 Dispose 方法的背后的原理
局部变量(如obj)的引用存储在栈上,而通过new关键字创建的类对象实例存储在堆上。这种设计使得 C# 能够有效地管理内存,同时提供了灵活性和性能。理解栈和堆的区别对于优化内存使用和提高程序性能非常重要。原创 2025-03-27 21:44:45 · 414 阅读 · 0 评论 -
局部变量内存分配细节
局部变量(如obj)的引用存储在栈上,而通过new关键字创建的类对象实例存储在堆上。这种设计使得 C# 能够有效地管理内存,同时提供了灵活性和性能。理解栈和堆的区别对于优化内存使用和提高程序性能非常重要。原创 2025-03-27 21:42:50 · 370 阅读 · 0 评论 -
谈谈GC.SuppressFinalize(this) 方法具体干的活是什么以及解决了什么问题
是一个重要的性能优化工具,特别是在实现接口的类中。通过防止不必要的终结器调用,可以提高应用程序的性能,并确保资源的及时释放。正确使用是良好资源管理的关键部分。原创 2025-03-27 21:36:57 · 814 阅读 · 0 评论