当前位置:  编程技术>.net/c#/asp.net
本页文章导读:
    ▪.NET互操作性入门系列(三):平台调用中的数据封送处理      本专题概要数据封送介绍封送Win32数据类型封送字符串的处理封送结构体的处理封送类的处理小结 一、数据封送介绍看到这个专题时,大家的第一个疑问肯定是——什么是数据封送.........
    ▪采用反射使用类(程序集)       object[] obj = new object[1]; obj[0] = “需要传入的属性”; result = (Animal)Assembly.Load("程序集名称").CreateInstance("程序集名称." + “类名”, false, BindingFlags.CreateInstance.........
    ▪vs2012创建mvc4项目部署iis所遇到的问题      最近开始学习mvc,遇到了一个问题。部署在iis上的mvc项目无法正常运行。上网搜资料找原因也无果,但最终得到了群友的帮助,感谢Webdiyer。解决办法就是改下web.config 的配置<system.webServer>.........

[1].NET互操作性入门系列(三):平台调用中的数据封送处理
    来源:    发布时间: 2013-10-28

本专题概要

  • 数据封送介绍
  • 封送Win32数据类型
  • 封送字符串的处理
  • 封送结构体的处理
  • 封送类的处理
  • 小结

 

一、数据封送介绍

看到这个专题时,大家的第一个疑问肯定是——什么是数据封送呢?(这系列专题中采用假设朋友的提问方式来解说概念,就是希望大家带着问题去学习本专题内容,以及大家在平时的学习过程中也可以采用这个方式,个人觉得这个方式可以使自己学习效率有所提高,即使这样在学习的过程可能会显得慢了,但是这种方式会对你所看过的知识点会有一个更深的印象。远比看的很快,最后却发现记住的没多少强,在这里分享下这个学习方式,认为可以接受的朋友可以在平时的学习中可以尝试下的,如果觉得不好的话,相信大家肯定也会有自己更好的学习方式的。)对于这个问题的解释是,数据封送是——在托管代码中对非托管函数进行互操作时,需要通过方法的参数和返回值在托管内存和非托管内存之间传递数据的过程,数据封送处理的过程是由CLR(公共语言运行时)的封送处理服务(即封送拆送器)完成的。

封送拆送器主要进行3项任务:

  • 将数据从托管类型转换为非托管类型,或从非托管类型转换为托管类型
  • 将经过类型转换的数据从托管代码内存复制到非托管内存,或从非托管内存复制到托管内存
  • 调用完成后,释放封送处理过程中分配的内存
  • 二、封送Win32数据类型

    对非托管代码进行互操作时,一定会有数据的封送处理。然而封送时需要处理的数据类型分为两种——可直接复制到本机结构中的类型(blittable)和非直接复制到本机结构中的类型(non-bittable)。下面就这两种数据类型分别做一个介绍。

    2.1 可直接复制到本机结构中的类型

    由于在托管代码和非托管代码中,数据类型在托管内存和非托管内存的表示形式不一样,因为这样的原因,所以我们需要对数据进行封送处理,以至于在托管代码中调用非托管函数时,把正确的传入参数传递给非托管函数和把正确的返回值返回给托管代码中。然而,并不是所有数据类型在两者内存的表现形式不一样的,这时候我们把在托管内存和非托管内存中有相同表现形式的数据类型称为——可直接复制到本机结构中的类型,这些数据类型不需要封送拆送器进行任何特殊的处理就可以在托管和非托管代码之间传递, 下面列出一些课直接复制到本机结构中的简单数据类型:

     Windows 数据类型

    非托管数据类型

    托管数据类型

    托管数据类型解释

     BYTE/Uchar/UInt8

    unsigned char

    System.Byte

    无符号8位整型

     Sbyte/Char/Int8

    char

    System.SByte

    有符号8位整型

     Short/Int16

    short

    System.Int16

    有符号16位整型

     USHORT/WORD/UInt16/WCHAR

    unsigned short

    System.UInt16

    无符号16位整型

     Bool/HResult/Int/Long

    long/int

    System.Int32

    有符号32位整型

     DWORD/ULONG/UINT

    unsigned long/unsigned int

    System.UInt32

    无符号32位整型

     INT64/LONGLONG

    _int64

    System.Int64

    有符号64位整型

     UINT64/DWORDLONG/ULONGLONG

    _uint64

    System.UInt64

    无符号64位整型

     INT_PTR/hANDLE/wPARAM

    void*/int或_int64

    System.IntPtr

    有符号指针类型

     HANDLE

    void*

    System.UIntPtr

    无符号指针类型

     FLOAT

    float

    System.Single

    单精度浮点数

     DOUBLE

    double

    System.Double

    双精度浮点数

    除了上表列出来的简单类型之外,还有一些复制类型也属于可直接复制到本机结构中的数据类型:

    (1) 数据元素都是可直接复制到本机结构中的一元数组,如整数数组,浮点数组等

    (2)只包含可直接复制到本机结构中的格式化值类型

    (3)成员变量全部都是可复制到本机结构中的类型且作为格式化类型封送的类

    上面提到的格式化指的是——在类型定义时,成员的内存布局在声明时就明确指定的类型。在代码中用StructLayout属性修饰被指定的类型,并将StructLayout的LayoutKind属性设置为Sequential或Explicit,例如:

    using System.Runtime.InteropServices;

    // 下面的结构体也属于可直接复制到本机结构中的类型
    [StructLayout(LayoutKind.Sequential)]
    public struct Point {

        
    [2]采用反射使用类(程序集)
        来源:    发布时间: 2013-10-28
    object[] obj = new object[1];
    obj[0] = “需要传入的属性”;
    result = (Animal)Assembly.Load("程序集名称").CreateInstance("程序集名称." + “类名”, false, BindingFlags.CreateInstance, null, obj, null, null);

      

    本文链接


        
    [3]vs2012创建mvc4项目部署iis所遇到的问题
        来源:    发布时间: 2013-10-28

    最近开始学习mvc,遇到了一个问题。部署在iis上的mvc项目无法正常运行。

    上网搜资料找原因也无果,但最终得到了群友的帮助,感谢Webdiyer。

    解决办法就是改下web.config 的配置

    <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />

    我是在vs2012下创建的测试项目,听其他群友说用vs2010 创建的mvc项目会自动加上这句。所以好吧。

    本文链接


        
    最新技术文章:
    ▪C#通过IComparable实现ListT.sort()排序
    ▪C#实现对Json字符串处理实例
    ▪Winform实现抓取web页面内容的方法
    ▪Winform实现将网页生成图片的方法
    ▪C#控制台程序中处理2个关闭事件的代码实例
    ▪WinForm实现同时让两个窗体有激活效果的特效...
    ▪WinForm实现拦截窗体上各个部位的点击特效实...
    ▪用C#的params关键字实现方法形参个数可变示例
    ▪C#判断某程序是否运行的方法
    ▪C#验证码识别基础方法实例分析
    ▪C#通过WIN32 API实现嵌入程序窗体
    ▪C#实现获取鼠标句柄的方法
    ▪C#事件处理和委托event delegate实例简述
    ▪C#获取程序文件相关信息的方法
    ▪C#中的除法运算符与VB.NET中的除法运算符
    ▪ASP.NET MVC 5使用X.PagedList.Mvc进行分页教程(PagedLi...
    ▪Base64编码解码原理及C#编程实例
    ▪C#实现的优酷真实视频地址解析功能(2014新算...
    ▪C#和SQL实现的字符串相似度计算代码分享
    ▪C#使用Word中的内置对话框实例
    ▪C#反射之基础应用实例总结
    ▪C#生成单页静态页简单实例
    ▪C#实现SMTP邮件发送程序实例
    ▪C#实现随鼠标移动窗体实例
    ▪C#使用GDI+创建缩略图实例
    ▪C#实现通过模板自动创建Word文档的方法
    ▪C#中Response.Write常见问题汇总
    ▪C#中多态、重载、重写区别分析
    ▪WinFrom中label背景透明的实现方法
    ▪C#中out保留字用法实例分析
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3