(一).NET 框架开发平台体系结构(笔记)

      要想深入研究一门言语,必须先了解其体系架构。回顾这些年只重视.NET应用,而忽视了平台的研究,现在回过头来再看.NET框架开发设计,感慨颇多。俗话说好记性不如烂笔头,借助博客来总结一些.NET框架开发设计经验。

    1. 将源代码编译成托管模块

         .NET 核心是CLR 通用语言运行时,各种语言经过各自编译器,将源代码编译成托管模块(如:c# =》C#编译器 =》托管模块(IL及元数据)),其中元数据是一种数据表的集合,包含托管代码定义的各种类型,方法,同时还包含了引用信息。

       托管模块包含:PE表头(指出文件类型,文件创建时间,本地cpu代码一些信息),CLR表头(标记托管代码入口方法),元数据,IL代码)

       C++默认是非托管模块。  

    2. 将托管模块组合成程序集

         CLR 不直接与托管模块打交道,而是与程序集(assembly)。

         程序集是由一个或多个托管模块以及一些资源文件的逻辑组合,同时也是组建复用,实施安全策略和版本策略的最小单位 。

         程序集中包含一个清单(描述组成程序集的文件)数据块,版本 自描述信息,即包含CLR执行的所需的所有信息,不需要注册表或者活动目录的额外信息,因此部署程序集要比非托管组件容易。 

    3. 加载通用语言运行时

            MSCOREE.DLL(微软组件对象运行时执行引擎)。

           程序集dll的入口函数如何加载CLR?  

           编译器/连接器创建可执行程序集时,会在PE中的.text部分写入一个X86 的stub 函数  JMP _COREXEMAIN (该方法来源于MSCOREE.DLL),MSCOREE.DLL 被引用到.data部分。

           当托管exe文件被调用,windows将像对待通常(非托管)的exe一样,首先加载该文件,然后检查data,发现 MSCOREE.DLL后,将其载入进程地址空间,于是就加载COREXEMAIN函数的地址,并修正X86 的stub 函数。

           主线程执行修改后的X86 的stub 函数,该函数跳转到COREXEMAIN函数地址上。COREXEMAIN初始化CLR,并查询程序集的CLR表头确定入口函数,入口函数找到后,IL代码被编译成本地CPU指令。

          最后CLR跳转到编译好的CPU指令地址上,执行。

         注意 托管PE文件都是32位,64window加载器会给其分配64位地址空间。

    4. 执行程序集代码(IL与代码验证)

 知识产权保护:(IL反编译)

            A. 代码 在公司服务器上,外界很难获取到

            B.  对外发布的代码可以加入混淆器,或者部分敏感算法可以采用非托管代码编写

        托管代码:

            A. CLR 语言集成优势(许编程语言之间方便切换与集成),可以采用C#的I/0处理,APL工程计算。

            B. 独立于底层CPU

            C. 第一次需要编译于验证,后续执行本地代码

         托管代码与非托管代码性能:

            编译器对于执行环境的了解多于非托管编译器,

           A.JIT  可以利用cpu特殊指令,而非托管的只是用最小的通用功能集合cup平台。

           B. JIT 能检查到运行时的机器上某些总是返回错误的布尔测试,不产生cup代码

           C. CLR能够评估执行情况并有选择性的将IL代码编译成本地代码


         IL代码验证,试代码更健壮。验证的过程有:不能从未初始化的的地址取值,每个方法调用时必须传入正确的参数个数,正确的参数类型,每个返回值是否正确使用,每个方法必须有返回值等。

         托管代码验证的健壮性,不会访问不该访问的地址空间,可以不独立未其开辟进程空间,即可以共用。

    5. .NET框架类库

         框架类库(Framwork Class Library   FCL).

    6. 通用类型系统

         通用类型系统(Common type system   CTS).

         CTS 只支持单继承,所有类型直接或者间接继承System.Object。

         System.Object 运行操作如下:

             判断两个实例是否相等;获取实例的散列码;查询实例的类型;执行实例的浅拷贝;获取实例当前状态的字符串表示。

    7. 通用语言规范

          COM允许不同语言创建的对象相互通信。CRL 集成所有编程语言,允许一种语言创建的对象在另一种语言代码中被看做同等成员。CLR 的标准类型集合,自描述类型信息(元数据) 和通用执行环境使之成为可能。

        各语言的差别很大,比如不区分大小写,不提供无符号的整数,不支持运算符重载,不支持可变数目的参数。

          通用语言规范(CLS) 定义了所有CRS编译器必须支持的最小特性集合。

           

         在类前面 加上特性 [assembly: CLSCompliant(true)]  //告诉编译器执行CLS检查

         internal 不能用于程序集外,所以不参与CLS检查。关于CLS规则,详见SDK“跨语言互操作”部分。

         有些特殊的抽象,没有映射在字段,方法上,而是在附加在类型信息上。

    8. 与非托管代码互操作

           CLR 支持三种互操作:

              托管代码调用非托管的dll

             托管代码调用com组件(非托管类型作为COM服务器)

              非托管代码 调用托管类型(托管类型作为COM服务器)(需要加入#using <mscorlib.dll> // 使用定义在该程序集的托管类型  clr编译)

              

   

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: .NET WinForm是一种用于开发Windows桌面应用程序的技术框架。我在使用.NET WinForm开发过程中积累了一些经验和心得,现将其总结如下。 首先,.NET WinForm具有丰富的控件库,并且提供了灵活的布局方式。我们可以根据需要选择合适的控件来设计用户界面,并通过属性和事件的设置来实现交互功能。此外,WinForm还支持多种布局方式,例如流式布局、表格布局等,能够满足不同界面设计的需求。 其次,开发过程中要注意控件的命名规范和代码的结构化。一个良好的命名规范可以使代码更易读、易维护,并且方便与团队合作。另外,将代码按功能模块进行组织,可以提高代码的可读性和可维护性。 另外,对于数据处理方面,我们可以使用.NET提供的ADO.NET来进行数据库的操作。ADO.NET提供了一套完整的对象模型,可以方便地连接、查询和更新数据库。此外,为了提高性能,我们可以使用数据绑定技术将数据与控件进行关联,从而实现数据的显示和编辑。 此外,为了提高用户体验,我们可以使用多线程来处理耗时的操作。在WinForm中,主线程负责界面的渲染和响应用户操作,而通过新建一个后台线程来处理耗时任务,可以避免界面的阻塞,提高用户体验。 最后,为了保证应用程序的稳定性和可靠性,我们需要进行适当的异常处理。在编写代码的过程中,我们应该考虑到各种可能出现的异常情况,并编写相应的异常处理代码,以防止程序崩溃或出现不可预料的错误。 综上所述,使用.NET WinForm进行开发可以帮助我们快速构建功能丰富的Windows桌面应用程序。在开发过程中,我们应该注意控件的选择和布局的合理安排,遵循良好的命名规范和代码结构化,合理处理数据和耗时操作,添加适当的异常处理,以保证应用程序的稳定性和可靠性。 ### 回答2: .NET WinForm是一种使用C#或其他.NET支持的语言开发的桌面应用程序的框架。在.NET WinForm开发过程中,我积累了一些经验和技巧,我将在下面的笔记中进行总结。 首先,我要着重强调良好的用户界面设计。一个简洁、直观和易用的界面对于用户来说非常重要,因此在设计界面时,我会参考标准的用户体验原则和设计规范,确保界面元素的布局合理,按钮和菜单项的命名清晰明了。 其次,我经常使用控件的继承和自定义控件来提高开发效率和代码复用性。通过继承现有控件,并添加自定义功能或修改样式,可以快速创建符合特定需求的控件。这样可以减少代码的重复编写,并且便于后续的维护和扩展。 此外,我会尽量避免在界面上编写过多的业务逻辑。为了保持界面的简洁和响应速度,我将业务逻辑封装在独立的类中,并使用事件机制进行交互。这样可以实现界面和数据的解耦,提高代码的可维护性和可测试性。 对于数据的处理,我会使用.NET提供的数据绑定机制。通过将数据源与控件进行绑定,可以简化数据的展示和操作,减少手动编写代码的工作量。同时,数据绑定还可以实现数据的实时更新和显示,提升用户体验。 最后,我会使用调试工具和日志记录来帮助定位和解决问题。.NET WinForm提供了丰富的调试功能,如断点调试、条件断点和调试输出等。通过适当的调试设置和日志记录,可以及时发现问题,并进行相关的修复和优化。 总之,这些是我在.NET WinForm开发过程中的一些心得体会。良好的界面设计、控件的继承和自定义、业务逻辑和界面的解耦、数据绑定的使用以及调试工具和日志记录的运用,都是我在开发过程中重要的思考和实践。我相信通过不断学习和尝试,我将能够提高开发效率和代码质量,为用户创造出更好的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值