概述C# COM接口相关知识

开发 后端
本文介绍为了保证同一个C# COM接口具有相同的托管类型推荐使用PIA,但是,在使用PIA的过程中,发现PIA有不少问题,因此CLR Interop的某位牛人Architect想出了新Idea。

C# 4.0中有下面这些功能: 1. dynamic/IDynamicObject 这个改进使得C#向动态语言又进了一步,虽然C#并不会变成类似Perl/Python之类的动态语言(因为Anders认为静态语言所支持的一些特性比如Intellisense,类型检查等等是相当有用的),但是这并不代表C#不应该对动态特性提供更好的支持。从我们Interop的角度来看,dynamic比较类似COM中的IDispatch,也就是动态的根据提供的函数/属性名字动态选择匹配的动作并执行之,只不过这个接口现在变成了IDynamicObject。写法也很类似VB6。原来要写:

  1. object obj = GetObject();  
  2. 2: obj.GetType().InvokeMember(“CallSomeFunc”, …., new object[] { 1 }); 

现在只需:

  1. dynamic obj = GetObject();  
  2. obj.CallSomeFunc(1); // obj通过IDynamicObject接口,支持CallSomeFunc方法。 

这一切都是通过IDynamicObject接口实现的。只要对象支持IDynamicObject,那么任意对象都可以通过这种方式来直接调用,不管是COM,Python,JavaScript,等等。这个功能感觉基本上就是定义一个C# COM接口,然后编译器再把代码翻译一下就好了,关键还是各种对象的支持。 2. Optional Parameter / Named Parameters 以前C#特意不支持的可选参数终于现在可以支持了。命名参数也可以支持了,使用参数加冒号:

  1. OpenTextFile(“foo.txt”, Encoding.UTF8, bufferSize:123) 

Improved COM Interoperability

1.Automatic object –> dynamic mapping 原来返回object的地方,现在object可以自动被视为dynamic。因此,以前需要cast的地方现在可以省去cast了,反正dynamic 对象可以通过IDynamicObject来间接调用IDispatch接口(我觉得应该还是通过MemberInfo.Invoke来间接调用 IDispatch,但是暂时没有时间验证其实现方式)来自动调用对应的函数,而不需要cast到对应的interface再调用。原来是: (Range)excel.Cells[1, 1].Value = xxx; 现在可以写成:excel.Cells[1,1].Value = xxx; // call IDynamicObject.SetMember(“Value”, xxx);

2.Optional and named parameters 这个无需多说了吧。BTW,现在TlbImp的结果中(也就是Interop Assembly)已经在Metadata包含了缺省值,只是C#不用而已,现在C#可以直接使用了。

3.Indexed Property 这个Anders一句话带过,暂时不清楚具体是什么改进。

4.Optional ref modifier 在COM Interop时候可以不用写ref。具体的Anders也没有多谈。觉得应该是很小的改动。

5.Interop Type Embedding (NO PIA) 这个也就是之前我在前一篇提到的Type Equvalency。原来为了保证同一个C# COM接口具有相同的托管类型(因为对于同一个C# COM接口可以有多个对应的托管的接口),推荐使用PIA(Primary Interop Assembly)。但是,在使用PIA的过程中,发现PIA有不少问题,因此CLR Interop的某位牛人Architect想出了这个新Idea:不使用PIA,而是允许对应同一C# COM接口的不同托管接口之间可以互换使用,无需Cast,CLR内部将它们等价看待。这是一个比较大的改动,不管是对于编译器,还是CLR。

【编辑推荐】

  1. 简单介绍C#预处理
  2. 学习C#无词尾符号经验谈
  3. C#调用QuickTest自动化
  4. 详解C#正规表达式
  5. C#字符串插入html标签
责任编辑:佚名 来源: IT168
相关推荐

2009-08-10 13:40:46

创建C# COM对象

2009-09-02 14:18:08

C#声明COM接口

2009-08-25 10:57:09

C#接口

2009-08-03 18:26:18

C#定义接口成员

2009-08-21 08:41:44

C#反射

2009-08-28 10:22:47

C# DLLImpor

2009-09-02 14:14:44

C# COM接口转换

2009-08-07 13:30:20

C# Excel导入

2009-09-01 16:14:08

C# Socket类

2009-08-13 14:59:00

C#数据访问层

2009-08-31 09:44:23

C# Employee

2009-08-13 15:18:23

C#文件上传

2009-08-18 09:26:07

C#线程功能

2009-07-31 14:08:54

C# 匿名函数

2009-08-18 17:29:02

C#使用指针

2009-09-03 11:15:38

C#设置Coopera

2009-08-24 11:02:52

C#接口映射

2009-08-24 09:55:26

C#接口转换

2009-08-20 16:28:45

C#匿名方法

2009-08-25 10:08:39

C# MyData对象
点赞
收藏

51CTO技术栈公众号