iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >.NET 4.0的ICustomQueryInterface新特性是什么
  • 410
分享到

.NET 4.0的ICustomQueryInterface新特性是什么

2023-06-18 00:06:39 410人浏览 安东尼
摘要

本篇文章给大家分享的是有关.net 4.0的ICustoMQueryInterface新特性是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在.NET Framework

本篇文章给大家分享的是有关.net 4.0的ICustoMQueryInterface新特性是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

在.NET Framework v4.0发布的新功能中,在名字空间System.Runtime.InteropServices新增加了一个叫做ICustomQueryInterface的Interface, 顾名思义,这个Interface的功能就是使得用户可以自己控制QueryInterface这个COM最常用的函数的行为。在v4.0以前,所有作用于托管组件上的QI行为,都是由CLR内部的IUnkown:QueryInterface控制的,比如,如果你QI著名的IDispatch接口时,你得到的永远都是CLR提供的那个IDispatch,诸如此类的还有IMarshal/IProvideClassInfo等一些常用的Interface。如果你非常希望用自己的IDispatch实现来替换clr提供的实现,那么恭喜你,ICustomQueryInterface就是为你而生的!当然,ICustomQueryInterface所带来的,不仅仅是简单的Interface替换,它甚至可以使得Aggregate托管组件也成为现实。

让我们来看看这个ICustomQueryInterface的定义吧:

  1: public interface ICustomQueryInterface  2: {  3:     CustomQueryInterfaceResult GetInterface([In]ref Guid iid, out IntPtr ppv);  4: }  5:

是的,就是这么简单,就一个GetInterface方法,再仔细看看它的方法参数,是不是和c++里面的QueryInterface有点神似啊。哈哈,其实你可以把它理解成QueryInterface的托管实现也无妨啊!不过它还有个小小的功能,就是如果自己不想处理这个QI,就返回NotHandled, clr看到这个返回值,就会调用自己的QI实现来帮你处理这个请求,爽吧。

让我们来看看有了这个Interface之后clr内部关于QI的处理流程图吧:

.NET 4.0的ICustomQueryInterface新特性是什么
.NET 4.0新特性:ICustomQueryInterface

从这个图上我们可以看到,除了不能处理对IUnknown的QI请求(要求别太高嘛),其他统统OK!

理论一大堆了,来实战一下。

看看我们的托管组件的实现

using System;
2: using System.Runtime.InteropServices;
3:
4: namespace States
5: {   
6:     [Guid("00020400-0000-0000-C000-000000001147")]
7:     [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
8:     public interface ICQ
9:     {
10:         int func();
11:         void slot2();
12:         void slot3();
13:         void slot4();
14:     }
15:
16:     [Guid("11120400-0000-0000-C000-000000001148")]
17:     [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
18:     public interface IA
19:     {
20:         int FuncA();
21:     }
22:
23:     [Guid("22220400-0000-0000-C000-000000001149")]
24:     [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
25:     public interface IB
26:     {
27:         int FuncB();
28:     }
29:
30:
31:
32:     [Guid("00020400-0000-0000-C000-000000001150")]
33:     [ClassInterface(ClassInterfaceType.None)]
34:     public class StatesComServer : ICustomQueryInterface, ICQ, IA, IB
35:     {
36:           public readonly Guid IID_IA = new Guid("11120400-0000-0000-C000-000000001148");
37:        
38:           public CustomQueryInterfaceResult GetInterface([In]ref Guid iid, out IntPtr intf)
39:           {
40:                 if (iid == WellKnownGuids.IID_IDispatch)
41:                 {
42:                     intf = Marshal.GetComInterfaceForObject(this, typeof(ICQ), CustomQueryInterfaceMode.Ignore);
43:                     return CustomQueryInterfaceResult.Handled;
44:                 }
45:
46:                 if (iid == IID_IA)
47:                 {
48:                     intf = IntPtr.Zero;
49:                     return CustomQueryInterfaceResult.Failed;
50:                 }
51:
52:                 intf = IntPtr.Zero;
53:                 return CustomQueryInterfaceResult.NotHandled;
54:           }
55:
56:           public int func()
57:           {
58:               Console.WriteLine("This is Interface ICQ, not the IDispatch!!!");
59:                return 2008;
60:           }
61:
62:           public int FuncA()
63:           {
64:               Console.WriteLine("This is Interface IA!!!");
65:               return 3008;
66:           }
67:
68:           public int FuncB()
69:           {
70:               Console.WriteLine("This is Interface IB!!!");
71:               return 4008;
72:           }
73:
74:
75:         #region Empty Functions
76:           public void slot2() { }
77:           public void slot3() { }
78:           public void slot4() { }
79:         #endregion
80:     }
81:
82: }
83:

这里稍微做个解释,GetInterface的返回值如果是CustomQueryInterfaceResult.Failed,意思是QI失败。CustomQueryInterfaceResult.NotHandled意思是让clr去处理这个请求,CustomQueryInterfaceResult.Handled是告诉clr,已经处理好了,指针值保存在intf里面,直接返回给用户就可以了。

再来看看我们的客户端

IDispatch * pDisp = NULL;  printf("Scenario 1: QI IDispatch interface, Expected the Custom IDispatch interface\n");  hresult = pUnknown->QueryInterface(IID_IDispatch, (void**)&pDisp);   UINT count  = 0;  hresult = pDisp->GetTypeInfoCount(&count);  printf("Return value of GetTypeInfoCount is %d\n", count);     IA * pA = NULL;  printf("Scenario 2: QI IA interface, Expected failed\n");  hresult = pUnknown->QueryInterface(IID_IA, (void**)&hresult);  if (FAILED(hresult))  {    printf("Failed to QI IA with error code %x\n", count);    }  IB * pB = NULL;  printf("Scenario 3: QI IB interface interface, Expected the IB interface\n");  hresult = pUnknown->QueryInterface(IID_IB, (void**)&pB);  long i  = 0;  hresult = pB->FuncB(&i);

再来看看我们的输出结果。

Scenario 1: QI IDispatch interface, Expected the Custom IDispatch interface This is Interface ICQ, not the IDispatch!!!  Return value of GetTypeInfoCount is 2008  Scenario 2: QI iA interface, Expected failed  Failed to QI IA with error code 7d8  Scenario 3: QI IB interface interface, Expected the IB interface This is Interface IB!!!

以上就是.NET 4.0的ICustomQueryInterface新特性是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: .NET 4.0的ICustomQueryInterface新特性是什么

本文链接: https://www.lsjlt.com/news/294879.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • .NET 4.0的ICustomQueryInterface新特性是什么
    本篇文章给大家分享的是有关.NET 4.0的ICustomQueryInterface新特性是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在.NET Framework ...
    99+
    2023-06-18
  • .NET 4.0的新特性是什么
    这篇文章主要介绍了.NET 4.0的新特性是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇.NET 4.0的新特性是什么文章都会有所收获,下面我们一起来看看吧。.NET Framework是支持生成和运行下...
    99+
    2023-06-17
  • .NET 4.0新特性Dynamic是什么
    这篇文章将为大家详细讲解有关.NET 4.0新特性Dynamic是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前段时间看过一些关于dynamic这个C#4中的新特性,看到有些朋友认为dynamic的...
    99+
    2023-06-17
  • .NET 4.0中异常处理方面的新特性有哪些
    这篇文章将为大家详细讲解有关.NET 4.0中异常处理方面的新特性有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。作为程序员,我想很多人应该都有过跟异常打交道的经历。而且相信也有很多人也都写过catc...
    99+
    2023-06-17
  • ASP.NET 4.0新特性的改进有哪些
    这期内容当中小编将会给大家带来有关ASP.NET 4.0新特性的改进有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。ASP.NET 4.0新特性中,关于ClientID的改进可以在执行嵌套空间时,控制...
    99+
    2023-06-17
  • Java11的新特性是什么
    这篇文章主要讲解了“Java11的新特性是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java11的新特性是什么”吧!1. String API字符串绝对是 Java 中最常用的一个类...
    99+
    2023-06-02
  • CSS3的新特性是什么
    本篇内容主要讲解“CSS3的新特性是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS3的新特性是什么”吧! 1.属性选择器(常用的简单归纳下) [a...
    99+
    2024-04-02
  • es6的新特性是什么
    这篇文章将为大家详细讲解有关es6的新特性是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。es6新特性:const与let变量、模板字面量、解构、增强的对象字面量、for...of循环、展开运算符(....
    99+
    2023-06-06
  • MySQL8.0的新特性是什么
    本篇文章给大家分享的是有关MySQL8.0的新特性是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。大量使用 class 重构代码明面上: ...
    99+
    2024-04-02
  • PHP7的新特性是什么
    这篇文章主要介绍“PHP7的新特性是什么”,在日常操作中,相信很多人在PHP7的新特性是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP7的新特性是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-17
  • MySQL8.0新特性是什么
    本篇内容主要讲解“MySQL8.0新特性是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL8.0新特性是什么”吧!1. 默认字符集由latin1变为...
    99+
    2024-04-02
  • php7.4新特性是什么
    这篇文章主要介绍了php7.4新特性是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、...
    99+
    2023-06-14
  • es6新特性是什么
    小编给大家分享一下es6新特性是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!es6新特性:1、ES6 引入了class,让JavaScript的面向对象编程...
    99+
    2023-06-06
  • Java13新特性是什么
    这篇文章主要介绍了Java13新特性是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 Java13新特性 Java 13 的官方开发...
    99+
    2024-04-02
  • css3中的新特性是什么
    这篇文章给大家分享的是有关css3中的新特性是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。css的基本语法是什么css的基本语法是:1、css规则由选择器和一条或多条声明两个部分构成;2、选择器通常是需要改...
    99+
    2023-06-14
  • php7.3新特性指的是什么
    这篇文章主要介绍php7.3新特性指的是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、较为灵活的Heredoc和Nowdoc语法结束标记不再需要单独的一行或紧跟分号。与此同时,终止标记也可以使用缩进,当使用缩...
    99+
    2023-06-14
  • Oracle 20c新特性是什么
    本篇内容主要讲解“Oracle 20c新特性是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle 20c新特性是什么”吧!在 Oracle Data...
    99+
    2024-04-02
  • Oracle 12C新特性是什么
    这篇文章主要讲解了“Oracle 12C新特性是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Oracle 12C新特性是什么”吧!在12c里,推出了H...
    99+
    2024-04-02
  • MySQL 5.7 新特性是什么
    小编给大家分享一下MySQL 5.7 新特性是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!我们自豪的宣布 MySQL 5.7 稳定版开放下载了。 MySQL 5.7.9 是...
    99+
    2024-04-02
  • Go1.20 arena新特性是什么
    这篇文章主要讲解了“Go1.20 arena新特性是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go1.20 arena新特性是什么”吧!快速背景Arena 指的是...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作