本专题概要
- 数据封送介绍
- 封送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,例如:
// 下面的结构体也属于可直接复制到本机结构中的类型
[StructLayout(LayoutKind.Sequential)]
public struct Point {
obj[0] = “需要传入的属性”;
result = (Animal)Assembly.Load("程序集名称").CreateInstance("程序集名称." + “类名”, false, BindingFlags.CreateInstance, null, obj, null, null);
本文链接
最近开始学习mvc,遇到了一个问题。部署在iis上的mvc项目无法正常运行。
上网搜资料找原因也无果,但最终得到了群友的帮助,感谢Webdiyer。
解决办法就是改下web.config 的配置
<modules runAllManagedModulesForAllRequests="true" />
我是在vs2012下创建的测试项目,听其他群友说用vs2010 创建的mvc项目会自动加上这句。所以好吧。
本文链接