《Inside C#》笔记(十五) 非托管代码 下

二编写不安全代码

a)fixed关键字

《Inside C#》笔记(十五) 非托管代码 下

《Inside C#》笔记(十五) 非托管代码 下

代码中体现了fixed的用法:fixed (type* ptr= expression) { …};type是类似int*这样的非托管类型或void类型,expression是可以返回为type*指针的任意表达式,被fixed的变量只能在{…}中使用。

上面的代码运行后,foo.x=42。就只能看懂这一点了。

三 COM互操作

COM组件与.NET运行时的交互是通过COM Interop进行的。这儿涉及到很多COM组件的知识,以前只是在操作Word时用过Microsoft.Office.Interop.Word,这里只打算大概了解一下。

a)实例的COM组件为AirlineInfo COM,公开方法为:

《Inside C#》笔记(十五) 非托管代码 下

.NET只能使用包含元数据(metadata)的组件,而COM内部不是这样的,大概是包含一些注册和类似接口的实现。所以,在操作COM之前,为其生成对应的元数据。这项工作由元数据层进行,它负责处理与数据类型相关的信息,然后运行时基于这些类型信息生成RCW(Runtime Callable Wrapper 运行时可调用包装)。RCW负责COM对象的激活、Marshal、生命周期管理等事项。

《Inside C#》笔记(十五) 非托管代码 下

b)使用tlbimp.exe可以根据后缀为.tlb的COM文件生成.dll文件,然后就可以像使用普通的类一样使用dll中的类和元数据了。

c)使用b中提的方法(早绑定)会进行强类型检查、自动完成等特性,但有时无法在编译时就知道COM对象的元数据,这时就需要使用晚绑定的方法了。

《Inside C#》笔记(十五) 非托管代码 下

只要知道COM组件中某个方法名称,就可以使用Type.GetTypeFromProgID反射调用方法了。

学习资料:Inside C# by Tom Archer

上一篇:POJ3087(KB1-G 简单搜索)


下一篇:python pytest测试框架介绍五---日志实时输出