Microsoft.VisualC 命名空间包含支持用 c + + 语言的代码生成和编译的类。 混合编程中使用COM接口指针
Microsoft.VisualC 命名空间包含支持用 c + + 语言的代码生成和编译的类。
Microsoft.VisualC.StlClr
Unmanaged Code 和 Managed Code 混合编程中使用COM接口指针的一种方法 ,大家先看一段代码。
- private unsafe void Initialize(IDispatch* pObject)
- {
- this.m_pdispObject = pObject;
- **(((int*) pObject))[](pObject);
- this.m_eventIID = Guid.Empty;
- this.m_dwEventCookie = ;
- }
这是使用C#语言写的某Class的一个成员函数内的部分代码。
其中 **(((int*) pObject))[4](pObject); 这一行是关键的一笔,初看起来,很像是早期使用C语言写OLE程序时的情景,至少有异曲同工的感觉。
要理解这一行代码的意思,需要看一下在上下文中IDispatch的定义:
- [StructLayout(LayoutKind.Sequential, Size=), MiscellaneousBits(0x41), DebugInfoInPDB, NativeCppClass, CLSCompliant(false)]
- public static class IDispatch : ValueType
- {
- }
这又是在C#语言中定义对应于C++ Class的Object的VPtr的一种非常妙的方法。
至此,就可以完全清楚前面那段代码的意思了:
- **(((int*) pObject))[](pObject);
这一行相当于C++中的
- pObject->AddRef();
至于"[]"操作符中,为什么是4代表了AddRef调用,留给读者自己去理解,结合COM规范中接口的本质、C++ Class的V-Table的布局,不难得到答案。
Unmanaged Code和Managed Code混合编程中,这种使用COM接口指针的方法,虽稍显晦涩,但在不方便使用C++/CLI而必须使用C#的地方,还是很方便的,而且整体来看,这种方式也还是相当优雅的。
Attribute 类 表示自定义特性的基类
- [SerializableAttribute]
- [AttributeUsageAttribute(AttributeTargets.All, Inherited = true,
- AllowMultiple = false)]
- [ClassInterfaceAttribute(ClassInterfaceType.None)]
- [ComVisibleAttribute(true)]
- public abstract class Attribute : _Attribute
名称 | 说明 | |
---|---|---|
![]() |
Attribute() |
初始化 Attribute 类的新实例。 |
名称 | 说明 | |
---|---|---|
![]() |
Equals(Object) |
此 API 支持 产品 基础结构,不应从代码直接使用。返回一个值,该值指示此实例是否与指定的对象相等。(覆盖 Object.Equals(Object)。) |
![]() |
Finalize() |
在垃圾回收将某一对象回收前允许该对象尝试释放资源并执行其他清理操作。(继承自 Object。) |
![]() ![]() |
GetCustomAttribute(Assembly, Type) |
检索应用于指定的程序集的自定义特性。 参数指定要搜索的程序集和自定义特性的类型。 |
![]() ![]() |
GetCustomAttribute(Assembly, Type, Boolean) |
检索应用于程序集的自定义属性。 参数指定的程序集、 自定义特性来进行搜索,并忽略的搜索选项的类型。 |
![]() ![]() |
GetCustomAttribute(MemberInfo, Type) |
检索应用于类型的成员的自定义特性。 参数指定该成员和要搜索的自定义属性的类型。 |
![]() ![]() |
GetCustomAttribute(MemberInfo, Type, Boolean) |
检索应用于类型的成员的自定义特性。 参数指定该成员、 自定义属性来进行搜索,以及是否要搜索的成员的祖先的类型。 |
![]() ![]() |
GetCustomAttribute(Module, Type) |
检索应用于模块的自定义属性。 参数指定该模块,以及要搜索的自定义特性的类型。 |
![]() ![]() |
GetCustomAttribute(Module, Type, Boolean) |
检索应用于某个模块的自定义特性。 参数指定模块、 类型的自定义属性来进行搜索,并忽略的搜索选项。 |
![]() ![]() |
GetCustomAttribute(ParameterInfo, Type) |
检索应用于方法参数的自定义特性。 参数指定的方法参数,以及要搜索的自定义属性的类型。 |
![]() ![]() |
GetCustomAttribute(ParameterInfo, Type, Boolean) |
检索应用于方法参数的自定义特性。 参数指定的方法参数、 自定义属性来进行搜索,以及是否要搜索祖先构成的方法参数的类型。 |
![]() ![]() |
GetCustomAttributes(Assembly) |
检索一个数组,它由应用于程序集的自定义属性组成。 参数指定程序集。 |
![]() ![]() |
GetCustomAttributes(Assembly, Boolean) |
检索一个数组,它由应用于程序集的自定义属性组成。 参数指定该程序集,并忽略的搜索选项。 |
![]() ![]() |
GetCustomAttributes(Assembly, Type) |
检索一个数组,它由应用于程序集的自定义属性组成。 参数指定要搜索的程序集和自定义特性的类型。 |
![]() ![]() |
GetCustomAttributes(Assembly, Type, Boolean) |
检索一个数组,它由应用于程序集的自定义属性组成。 参数指定的程序集、 类型的自定义属性来进行搜索,并忽略的搜索选项。 |
![]() ![]() |
GetCustomAttributes(MemberInfo) |
检索应用于类型的成员的自定义特性的数组。 参数指定的成员。 |
![]() ![]() |
GetCustomAttributes(MemberInfo, Boolean) |
检索应用于类型的成员的自定义特性的数组。 参数指定该成员、 自定义属性来进行搜索,以及是否要搜索的成员的祖先的类型。 |
![]() ![]() |
GetCustomAttributes(MemberInfo, Type) |
检索应用于类型的成员的自定义特性的数组。 参数指定该成员和要搜索的自定义属性的类型。 |
![]() ![]() |
GetCustomAttributes(MemberInfo, Type, Boolean) |
检索应用于类型的成员的自定义特性的数组。 参数指定该成员、 自定义属性来进行搜索,以及是否要搜索的成员的祖先的类型。 |
![]() ![]() |
GetCustomAttributes(Module) |
检索应用于模块的自定义特性的数组。 参数指定的模块。 |
![]() ![]() |
GetCustomAttributes(Module, Boolean) |
检索应用于模块的自定义特性的数组。 参数指定该模块,并忽略的搜索选项。 |
![]() ![]() |
GetCustomAttributes(Module, Type) |
检索应用于模块的自定义特性的数组。 参数指定该模块,以及要搜索的自定义特性的类型。 |
![]() ![]() |
GetCustomAttributes(Module, Type, Boolean) |
检索应用于模块的自定义特性的数组。 参数指定该模块、 自定义特性来进行搜索,并忽略的搜索选项的类型。 |
![]() ![]() |
GetCustomAttributes(ParameterInfo) |
检索应用于方法参数的自定义特性的数组。 一个参数指定的方法参数。 |
![]() ![]() |
GetCustomAttributes(ParameterInfo, Boolean) |
检索应用于方法参数的自定义特性的数组。 参数指定的方法参数,以及是否搜索方法参数的祖先。 |
![]() ![]() |
GetCustomAttributes(ParameterInfo, Type) |
检索应用于方法参数的自定义特性的数组。 参数指定的方法参数,以及要搜索的自定义特性的类型。 |
![]() ![]() |
GetCustomAttributes(ParameterInfo, Type, Boolean) |
检索应用于方法参数的自定义特性的数组。 参数指定的方法参数、 自定义特性来进行搜索,以及是否要搜索的方法参数的祖先的类型。 |
![]() |
GetHashCode() |
返回此实例的哈希代码。(覆盖 Object.GetHashCode()。) |
![]() |
GetType() | |
![]() |
IsDefaultAttribute() |
在派生类中重写时,指示此实例的值是否是派生类的默认值。 |
![]() ![]() |
IsDefined(Assembly, Type) |
确定是否将任何自定义特性应用于程序集。 参数指定要搜索的程序集和自定义特性的类型。 |
![]() ![]() |
IsDefined(Assembly, Type, Boolean) |
确定是否将任何自定义特性应用于程序集。 参数指定的程序集、 自定义特性来进行搜索,并忽略的搜索选项的类型。 |
![]() ![]() |
IsDefined(MemberInfo, Type) |
确定是否将任何自定义特性应用于类型的成员。 参数指定要搜索的成员和自定义特性的类型。 |
![]() ![]() |
IsDefined(MemberInfo, Type, Boolean) |
确定是否将任何自定义特性应用于类型的成员。 参数指定该成员、 自定义属性来进行搜索,以及是否要搜索的成员的祖先的类型。 |
![]() ![]() |
IsDefined(Module, Type) |
确定是否将具有指定任何的类型自定义特性应用于模块。 参数指定该模块,以及要搜索的自定义特性的类型。 |
![]() ![]() |
IsDefined(Module, Type, Boolean) |
确定是否将任何自定义特性应用于模块。 参数指定该模块、 自定义特性来进行搜索,并忽略的搜索选项的类型。 |
![]() ![]() |
IsDefined(ParameterInfo, Type) |
确定是否将任何自定义特性应用于方法参数。 参数指定的方法参数,以及要搜索的自定义特性的类型。 |
![]() ![]() |
IsDefined(ParameterInfo, Type, Boolean) |
确定是否将任何自定义特性应用于方法参数。 参数指定的方法参数、 自定义特性来进行搜索,以及是否要搜索的方法参数的祖先的类型。 |
![]() |
Match(Object) |
当在派生类中重写,则返回一个值,该值指示此实例是否等于指定的对象。 |
![]() |
MemberwiseClone() | |
![]() |
ToString() |
返回表示当前对象的字符串。(继承自 Object。) |
名称 | 说明 | |
---|---|---|
![]() ![]() |
_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
将一组名称映射为对应的一组调度标识符。 |
![]() ![]() |
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
检索对象的类型信息,然后可以使用该信息获取接口的类型信息。 |
![]() ![]() |
_Attribute.GetTypeInfoCount(UInt32) |
检索对象提供的类型信息接口的数量(0 或 1)。 |
![]() ![]() |
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
提供对某一对象公开的属性和方法的访问。 |
T:System.Attribute类将预定义的系统信息或用户定义的自定义信息与目标元素。一个目标元素可以是一个组件、类、构造函数、委托、枚举、事件、字段、接口、方法、可执行文件模块、参数、属性,返回值,结构,或另一个属性。
属性提供的信息也称为元数据。元数据可以在运行时检查由应用程序来控制程序如何处理数据,或在运行时由外部工具控制如何处理或维护应用程序本身。例如,在.NET框架预定义类型和使用属性来控制运行时的行为,和一些编程语言中使用的属性类型来表示不直接支持的语言功能。NET框架的通用类型系统。
所有的属性类型派生的直接或间接地从System.Attribute类。属性可应用于任何目标元素;多个属性可以应用于同一目标元素;属性可以由目标元素派生的元素继承。使用T:system.attributetargets类指定目标元素应用该属性。
T:System.Attribute类提供了方便的方法来检索和测试自定义属性。有关使用属性的更多信息,请参见应用属性并使用属性扩展元数据。
下面的代码示例演示如何使用System.Attribute T。
- using System;
- using System.Reflection;
- // An enumeration of animals. Start at 1 (0 = uninitialized).
- public enum Animal {
- // Pets.
- Dog = ,
- Cat,
- Bird,
- }
- // A custom attribute to allow a target to have a pet.
- public class AnimalTypeAttribute : Attribute {
- // The constructor is called when the attribute is set.
- public AnimalTypeAttribute(Animal pet) {
- thePet = pet;
- }
- // Keep a variable internally ...
- protected Animal thePet;
- // .. and show a copy to the outside world.
- public Animal Pet {
- get { return thePet; }
- set { thePet = value; }
- }
- }
- // 一个测试类,每种方法都有自己的宠物pet.
- class AnimalTypeTestClass {
- [AnimalType(Animal.Dog)]
- public void DogMethod() {}
- [AnimalType(Animal.Cat)]
- public void CatMethod() {}
- [AnimalType(Animal.Bird)]
- public void BirdMethod() {}
- }
- class DemoClass {
- static void Main(string[] args) {
- AnimalTypeTestClass testClass = new AnimalTypeTestClass();
- Type type = testClass.GetType();
- // Iterate through all the methods of the class.
- foreach(MethodInfo mInfo in type.GetMethods()) {
- // Iterate through all the Attributes for each method.
- foreach (Attribute attr in
- Attribute.GetCustomAttributes(mInfo)) {
- // Check for the AnimalType attribute.
- if (attr.GetType() == typeof(AnimalTypeAttribute))
- Console.WriteLine(
- "Method {0} has a pet {1} attribute.",
- mInfo.Name, ((AnimalTypeAttribute)attr).Pet);
- }
- }
- }
- }
- /*
- * Output:
- * Method DogMethod has a pet Dog attribute.
- * Method CatMethod has a pet Cat attribute.
- * Method BirdMethod has a pet Bird attribute.
- */
Microsoft.VisualC 命名空间包含支持用 c + + 语言的代码生成和编译的类。 混合编程中使用COM接口指针的更多相关文章
- 单片机C 语言与汇编语言混合编程
在单片机应用系统设计中,过去主要采用汇编语言开发程序. 汇编语言编写的程序对单片机硬件操作很方便,编写的程序代码短,效率高,但系统设计的周期长,可读性和可移植性都很差.C语言程序开发是近年来单片机系统 ...
- Microsoft Translator:消除面对面交流的语言障碍
Translator:消除面对面交流的语言障碍" title="Microsoft Translator:消除面对面交流的语言障碍"> James Simm ...
- Microsoft Visual C++ 不支持long long
Microsoft Visual C++ 不支持long long 在C/C++中,64为整型一直是一种没有确定规范的数据类型.现今主流的编译器中,对64为整型的支持也是标准不一,形态各异.一般来说, ...
- 汉高澳大利亚sinox接口捆绑经典winxp,全面支持unicode跨语言处理
用qtconfig(或者qtconfig-qt4)设置字体后,汉澳sinox视窗界面以跟winxp媲美的界面出现,爽心悦目. 并且视窗使用非常稳定.非常少出现死机无响应现象,堪称完美. 引入unico ...
- WPF应用程序支持多国语言解决方案
原文:WPF应用程序支持多国语言解决方案 促使程序赢得更多客户的最好.最经济的方法是使之支持多国语言,而不是将潜在的客户群限制为全球近70亿人口中的一小部分.本文介绍四种实现WPF应用程序支持多国语言 ...
- 推荐一个算法编程学习中文社区-51NOD【算法分级,支持多语言,可在线编译】
最近偶尔发现一个算法编程学习的论坛,刚开始有点好奇,也只是注册了一下.最近有时间好好研究了一下,的确非常赞,所以推荐给大家.功能和介绍看下面介绍吧.首页的标题很给劲,很纯粹的Coding社区....虽 ...
- JavaScript 实现命名空间(namespace)的最佳方案——兼容主流的定义类(class)的方法,兼容所有浏览器,支持用JSDuck生成文档
作者: zyl910 一.缘由 在很多的面向对象编程语言中,我们可以使用命名空间(namespace)来组织代码,避免全局变量污染.命名冲突.遗憾的是,JavaScript中并不提供对命名空间的原生支 ...
- gsoap入门:C/C++代码生成及编译--包含soapcpp2 -qname添加命名空间后报错的解决方法--可用
gsoap是什么 先来一段百度百科,说说gsoap是什么: gSOAP一种跨平台的开源的C/C++软件开发工具包.生成C/C++的RPC代码,XML数据绑定,对SOAP Web服务和其他应用形成高效的 ...
- 【UML 建模】UML建模语言入门 -- 静态图详解 类图 对象图 包图 静态图建模实战
发现个好东西思维导图, 最近开始用MindManager整理博客 . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/deta ...
随机推荐
- JMeter 分布式测试部署
对于并发量很大的需求,如上万并发量,受到CPU和内存的限制,单机模拟场景是实现不了的,为了让JMeter提供更大的负载能力,须使用它的分布式机制,即多台机器同时产生负载的功能. 以下参数分析可用于配置 ...
- Spring MVC 基础篇4
Spring MVC Controller中返回数据到页面 1.使用ModelAndView 进行数据返回到请求页面 2.利用Map类型的入参进行Controller返回到页面上 3.将数据放到Ses ...
- hdu 5179(数位DP||打表)
beautiful number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Android xmlpull 方式解析xml文件
1.新建一个xml文件,放在res/xml目录下 <?xml version="1.0" encoding="utf-8"?> <citys& ...
- Educational Codeforces Round 30 B【前缀和+思维/经典原题】
B. Balanced Substring time limit per test 1 second memory limit per test 256 megabytes input standar ...
- 树链剖分【p4114】Qtree-Query on a tree I
Description 给定一棵n个节点的树,有两个操作: CHANGE i ti 把第i条边的边权变成ti QUERY a b 输出从a到b的路径中最大的边权,当a=b的时候,输出0 Input 第 ...
- 最小生成树Kruskal+LCA+bfs【bzoj4242】水壶
Description JOI 君所居住的 IOI 市以一年四季都十分炎热著称. IOI 市被分成 \(H\) 行,每行包含 \(W\) 块区域.每个区域都是建筑物.原野.墙壁之一. IOI 市有 \ ...
- Codeforces Round #124 (Div. 1) C. Paint Tree(极角排序)
C. Paint Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- vijos P1234口袋的天空(Kruskal)(最小生成树)
P1234口袋的天空 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 描述 给你云朵的个数N,再给你M个关系,表示哪些云朵 ...
- 日期 function
SELECT SYSDATE, ADD_MONTHS(SYSDATE,), ADD_MONTHS(SYSDATE,), LAST_DAY(SYSDATE), MONTHS_BETWEEN(SYSDAT ...