Effective C# :创建二进制组件
二进制组件允许我们将各个功能分解后单独发布,.NET中将这种类型的二进制组件称作程序集,在共享逻辑、跨语言以及组件部署方面,程序集为我们提供了很多简化和便利。
程序集在.NET中充当了组件包的角色,每个程序集都可以独立的发布和升级,制约我们升级一个程序集的因素是“如何尽量减少程序集之间的耦合”。
当程序启动时,CLR加载器并不会加载所有被引用的程序集,而是之用当CLR需要某个程序集中的元素时,才会去解析相关的引用,它会首先找到被引用的程序集,然后加载它,并JIT编译必要的IL代码。
程序集分为“强命名程序集”和“弱命名程序集”,其中“强命名程序集”包含:程序集的文本名称、版本号、语言文化以及共有密钥标记。而“弱命名程序集”只包含程序集的文本名称。
注意:1)只有强命名程序集才可以存储在GAC中;2)我们可以使用配置文件来改变应用程序中每个强命名程序集的默认行为;3)强命名程序集可以防止恶意的篡改,从而可以为应用程序提供更高的安全保障。
程序集的版本号由4部分组成:Major.Minor.Build.Revision,编译器可以自动生成Build版本号和Revision版本号,生成规则:Build版本号是自2000年1月1日以来的天数;Revision版本号是自午夜以来的秒数再除以2,这种算法可以保证每次编译出来的版本号都是唯一的。
在升级程序集时,我们需要保证升级前的组件接口中的公有成员和受保护成员要和升级后的组件在IL层次上保持兼容,即我们不能删除方法、不能修改参数和返回值。我们必须确保升级后引用该组件的所有其他组件不需要重新编译。
作者:李潘
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通