2.5 将模块合并成一个程序集 - 1

本文探讨了.NET框架中的程序集概念,解释了程序集如何作为重用、版本控制和安全性的基本单位。文章详细介绍了程序集的组成部分,如manifest元数据表,并讨论了多文件程序集的优势。

前面讨论的Program.exe文件不止是一个带有metadataPE文件, 它也是一个程序集(assembly). 程序集是一个或多个包含类型定义和资源的文件的集合体. 组成一个程序集的文件被放到manifest, manifest是另一组metadata, 其包括着组成程序集的文件的名字, 他们也描述着程序集的版本, 语言, 发行者, 公开暴露的类型, 以及组成程序集的所有文件.

CLR在程序集进行操作, 也就是说, CLR总会先载入包含manifest表的文件, 然后通过manifest来获得程序集中的其他文件. 下面是你应该记住的有关程序集的特性:

Ÿ   程序集定义了可重用的类型

Ÿ   程序集用版本号来标记

Ÿ   程序集可以有与之关联的安全性信息

程序集中包含的文件不必有这些属性--除了包含manifest metadata表的文件.

对于软件包, 版本, 安全性, 类型, 你必须把它们放在模块中, 在多数情况中, 一个程序集只包含一个文件, 例如上面的Program.exe例子, 然而, 一个程序可以包含多个文件: 一些包含metadataPE文件, 和一些资源文件, 例如.gif.jpg文件. 你可以把一个程序集想象成一个逻辑上的EXE或者DLL.

我认为很多人会问为什么微软要引入程序集这个新的概念, 其原因是程序集能让你将逻辑上的类型重用和物理上的类型重用分离开. 例如, 程序集可以由多个类型组成, 你可以把频繁使用的类型放到一个文件中, 不太常用的类型放到另一个文件中, 如果你的程序集是通过Internet发布的, 如果客户端从不访问不太常用的类型, 那么它们所在的文件永远都不需要被下载到客户端. 例如, 一个独立的软件厂商(ISV)专注于UI控件, 它可能会选择在单独的模块中实现Active Accessibility类型(来满足微软的Logo要求). 只有需要这个额外Accessibility功能的用户才需要下载这个模块.

你可以通过在应用程序的配置文件中指定codeBase元素(第三章会讨论), 来配置应用程序来下载程序集文件. codeBase元素给出了一个URL来指向程序集文件所在的位置. 当企图载入一个程序集文件时, CLR获得codeBase元素的URL并检查机器的download cache来看文件是否存在, 如果文件存在, 那么就载入文件, 如果文件不在cache, 那么CLR就会下载文件并放到cache, 如果在URL所在的位置没找到哦文件, 那么会抛出FileNotFoundException.

我发现使用多文件的程序集的三个原因:

Ÿ   你可以在把你的不同类型放到不同的文件中, 这可以让文件逐个地下载, 例如上面提到的Internet下载的场合. 类型分离到不同的文件也能为你要购买的应用程序部分地打包, 部署.

Ÿ   你可以在你的程序集中添加资源或数据文件. 例如, 你可能有一个计算某种保险信息的计算器, 这个类型可能需要访问一些保险统计表格来完成它的计算. 不用将保险统计表格嵌入到你的源代码中, 你可以使用一个工具(例如Assembly Linker, AL.exe, 后面会讨论)使得数据文件成为程序集的一部分. 通过这种方式, 这个数据文件可以是任何类型的格式, 例如文本文件, Office Excel表格, Offfice Word表格, 或者其他你想用的任何数据, 只要你的应用程序知道如何解析文件的内容.

Ÿ   你可以创建包含用不同语言实现类型的程序集, 例如, 你可以用C#实现一些类型, VB实现另外一些类型, 以及其他语言实现其他类型. 当你编译用C#编写的源代码中的类型时, 编译器会产生一个模块. 当你编译用VB编写的源代码中的类型时, 编译器会产生另外一个模块. 然后你可以使用一个工具来组合所有的模块, 来产生一个程序集. 对于使用程序集的开发者来说, 程序集仅仅像是包含一群类型而已, 开发者不需要知道程序集使用了不同的语言. 通过这种方式, 如果你愿意, 你可以对每个模块运行ILDasm.exe来获得IL源代码文件, 然后你可以运行ILAsm.exe, 并传入所有的IL源代码文件, 它会产生一个单独的包含所有类型的文件, 这个技术需要你的源代码编译器产生IL-only代码.

重要: 总结一下, 一个程序集是一个重用, 版本控制, 和安全控制的单元. 它允许你把多个类型, 资源放到不同的文件中, 使得你和使用程序集的客户决定打包和部署哪些文件. 一旦CLR载入包含manifest的文件, 它可以决定程序集的那些文件包含着类型和资源, 使用程序集的人只需要知道包含manifest的文件名, 文件分割被抽象化出来, 将来可以改变分割的方式而不影响应用程序的行为.

如果你有多个类型, 它们可以共享一个版本号和安全设置, 那么推荐你把所有的类型放到一个单独的文件中, 而不是把它们分散到不同的文件, 更不要放到不同的程序集, 这是因为性能方面的原因, 载入一个文件/程序集要消耗CLRWindows的时间来找到程序集, 载入程序集, 和对其进行初始化. 载入越少的文件/程序集越好, 因为载入较少的程序集会帮助你减少工作集, 减少进程地址空间的碎片. 最后, 在处理大文件时, nGen.exe能执行更好的优化.

为了构建一个程序集, 你必须选择一个PE文件来包含manifest, 或者你可以创建一个单独的文件来只包含manifest, 2-3给出了manifest metadata:

Manifest metadata

描述

AssemblyDef

如果这个模块标识一个程序集, 那么只包含一个条目. 这个条目包括程序集的名称(没有路径和扩展名), 版本(主版本号, 次版本号, build版本号, 修改版本号), 语言, 标志, hash算法, 发行者的公开密(可以是null).

FileDef

对每个PE和资源文件(除了包含manifest的文件, 因为它在AssemblyDef表中)都包含一个条目, 条目包括文件名和扩展名(没有路径), hash,标志. 如果这个程序集只包含一个文件, 那么FileDef表没有条目.

ManifestResourceDef

对每个资源都包含一个条目, 条目包括资源的名字, 标志(如果对外部的程序集可见则为public, 否则为private), 以及指向FileDef表格的一个索引. 如果资源不是一个独立的文件(例如.jpg.gif文件), 那么资源是一个包含在PE文件中的流. 对于一个嵌入的资源, 条目还包含了一个偏移量来指示资源流在PE文件中的起始位置.

ExportedTypesDef

对每个公开的类型都包含一个条目, 条目包括类型的名字, 指向FileDef表的索引(表明那个文件实现了这个类型), 以及一个指向TypeDef表格的索引. 注意: 为了节约空间, 包含着manifest的文件中的导出类型不需要在这个表中重复了, 因为类型的信息可以在metadata中的TypeDef表中得到.

Manifest为程序集的客户与程序集的分割细节之间提供了间接一级, 使得程序集是自描述的. 记住包含manifest的文件具有metadata信息, 这些信息表示那些文件是程序集的一部分, 但是单独的文件没有metadata信息.

注意: 包含manifest的程序集文件还有一个AssemblyRef表格, 这个表格为每个被该程序集引用的引用的其它程序集都包含一个条目, 这可以让工具打开一个程序集的manifest, 查看它引用的程序集, 而不必打开程序集的其他文件. AssemblyRef表格中的条目使得程序集是自描述的.

 

本系统采用Python编程语言中的Flask框架作为基础架构,实现了一个面向二手商品交易的网络平台。该平台具备完整的前端展示与后端管理功能,适合用作学术研究、课程作业或个人技术能力训练的实际案例。Flask作为一种简洁高效的Web开发框架,能够以模块化方式支持网站功能的快速搭建。在本系统中,Flask承担了核心服务端的角色,主要完请求响应处理、数据运算及业务流程控制等任务。 开发工具选用PyCharm集环境。这款由JetBrains推出的Python专用编辑器集了智能代码提示、错误检测、程序调试与自动化测试等多种辅助功能,显著提升了软件编写与维护的效率。通过该环境,开发者可便捷地进行项目组织与问题排查。 数据存储部分采用MySQL关系型数据库管理系统,用于保存会员资料、产品信息及订单历史等内容。MySQL具备良好的稳定性和处理性能,常被各类网络服务所采用。在Flask体系内,一般会配合SQLAlchemy这一对象关系映射工具使用,使得开发者能够通过Python类对象直接管理数据实体,避免手动编写结构化查询语句。 缓存服务由Redis内存数据库提供支持。Redis是一种支持持久化存储的开放源代码内存键值存储系统,可作为高速缓存、临时数据库或消息代理使用。在本系统中,Redis可能用于暂存高频访问的商品内容、用户登录状态等动态信息,从而加快数据获取速度,降低主数据库的查询负载。 项目归档文件“Python_Flask_ershou-master”预计包含以下关键组部分: 1. 应用主程序(app.py):包含Flask应用初始化代码及请求路径映射规则。 2. 数据模型定义(models.py):通过SQLAlchemy声明与数据库表对应的类结构。 3. 视图控制器(views.py):包含处理各类网络请求并生回复的业务函数,涵盖账户管理、商品展示、订单处理等操作。 4. 页面模板目录(templates):存储用于动态生网页的HTML模板文件。 5. 静态资源目录(static):存放层叠样式表、客户端脚本及图像等固定资源。 6. 依赖清单(requirements.txt):记录项目运行所需的所有第三方Python库及其版本号,便于环境重建。 7. 参数配置(config.py):集中设置数据库连接参数、缓存服务器地址等运行配置。 此外,项目还可能包含自动化测试用例、数据库结构迁移工具以及运行部署相关文档。通过构建此系统,开发者能够系统掌握Flask框架的实际运用,理解用户身份验证、访问控制、数据持久化、界面动态生等网络应用关键技术,同时熟悉MySQL数据库运维与Redis缓存机制的应用方法。对于入门阶段的学习者而言,该系统可作为综合性的实践训练载体,有效促进Python网络编程技能的提升。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
在当代储能装置监控技术领域,精确测定锂离子电池的电荷存量(即荷电状态,SOC)是一项关键任务,它直接关系到电池运行的安全性、耐久性及整体效能。随着电动车辆产业的迅速扩张,业界对锂离子电池SOC测算的精确度与稳定性提出了更为严格的标准。为此,构建一套能够在多样化运行场景及温度条件下实现高精度SOC测算的技术方案具有显著的实际意义。 本文介绍一种结合Transformer架构与容积卡尔曼滤波(CKF)的混合式SOC测算系统。Transformer架构最初在语言处理领域获得突破性进展,其特有的注意力机制能够有效捕捉时间序列数据中的长期关联特征。在本应用中,该架构用于分析电池工作过程中采集的电压、电流与温度等时序数据,从而识别电池在不同放电区间的动态行为规律。 容积卡尔曼滤波作为一种适用于非线性系统的状态估计算法,在本系统中负责对Transformer提取的特征数据进行递归融合与实时推算,以持续更新电池的SOC值。该方法增强了系统在测量噪声干扰下的稳定性,确保了测算结果在不同环境条件下的可靠性。 本系统在多种标准驾驶循环(如BJDST、DST、FUDS、US06)及不同环境温度(0°C、25°C、45°C)下进行了验证测试,这些条件涵盖了电动车辆在实际使用中可能遇到的主要工况与气候范围。实验表明,该系统在低温、常温及高温环境中,面对差异化的负载变化,均能保持较高的测算准确性。 随附文档中提供了该系统的补充说明、实验数据及技术细节,核心代码与模型文件亦包含于对应目录中,可供进一步研究或工程部署使用。该融合架构不仅在方法层面具有创新性,同时展现了良好的工程适用性与测算精度,对推进电池管理技术的进步具有积极意义。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值