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 类的新实例。

属性

 
 
  名称 说明
TypeId

在派生类中实现时,获取此 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()

获取当前实例的 Type。(继承自 Object。)

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()

创建当前 Object 的浅表副本。(继承自 Object。)

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接口指针的更多相关文章

  1. 单片机C 语言与汇编语言混合编程

    在单片机应用系统设计中,过去主要采用汇编语言开发程序. 汇编语言编写的程序对单片机硬件操作很方便,编写的程序代码短,效率高,但系统设计的周期长,可读性和可移植性都很差.C语言程序开发是近年来单片机系统 ...

  2. Microsoft Translator:消除面对面交流的语言障碍

    ​ Translator:消除面对面交流的语言障碍" title="Microsoft Translator:消除面对面交流的语言障碍"> ​ James Simm ...

  3. Microsoft Visual C++ 不支持long long

    Microsoft Visual C++ 不支持long long 在C/C++中,64为整型一直是一种没有确定规范的数据类型.现今主流的编译器中,对64为整型的支持也是标准不一,形态各异.一般来说, ...

  4. 汉高澳大利亚sinox接口捆绑经典winxp,全面支持unicode跨语言处理

    用qtconfig(或者qtconfig-qt4)设置字体后,汉澳sinox视窗界面以跟winxp媲美的界面出现,爽心悦目. 并且视窗使用非常稳定.非常少出现死机无响应现象,堪称完美. 引入unico ...

  5. WPF应用程序支持多国语言解决方案

    原文:WPF应用程序支持多国语言解决方案 促使程序赢得更多客户的最好.最经济的方法是使之支持多国语言,而不是将潜在的客户群限制为全球近70亿人口中的一小部分.本文介绍四种实现WPF应用程序支持多国语言 ...

  6. 推荐一个算法编程学习中文社区-51NOD【算法分级,支持多语言,可在线编译】

    最近偶尔发现一个算法编程学习的论坛,刚开始有点好奇,也只是注册了一下.最近有时间好好研究了一下,的确非常赞,所以推荐给大家.功能和介绍看下面介绍吧.首页的标题很给劲,很纯粹的Coding社区....虽 ...

  7. JavaScript 实现命名空间(namespace)的最佳方案——兼容主流的定义类(class)的方法,兼容所有浏览器,支持用JSDuck生成文档

    作者: zyl910 一.缘由 在很多的面向对象编程语言中,我们可以使用命名空间(namespace)来组织代码,避免全局变量污染.命名冲突.遗憾的是,JavaScript中并不提供对命名空间的原生支 ...

  8. gsoap入门:C/C++代码生成及编译--包含soapcpp2 -qname添加命名空间后报错的解决方法--可用

    gsoap是什么 先来一段百度百科,说说gsoap是什么: gSOAP一种跨平台的开源的C/C++软件开发工具包.生成C/C++的RPC代码,XML数据绑定,对SOAP Web服务和其他应用形成高效的 ...

  9. 【UML 建模】UML建模语言入门 -- 静态图详解 类图 对象图 包图 静态图建模实战

    发现个好东西思维导图, 最近开始用MindManager整理博客 . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/deta ...

随机推荐

  1. Windows下卸载Oracle

    先在软件运行界面卸载 Oracle 一.删掉主目录 二.删除注册表内容.     运行regedit命令,删除下面内容: --1.HKEY_CLASSES_ROOT,删除此键下所有以Ora,Oracl ...

  2. 【SQL】宿主语言接口

    一般情况下,SQL语句是嵌套在宿主语言(如C语言)中的.有两种嵌套方式: 1.调用层接口(CLI):提供一些库,库中的函数和方法实现SQL的调用 2.直接嵌套SQL:在代码中嵌套SQL语句,提交给预处 ...

  3. 《Java编程思想》笔记 第四章 控制执行流程

    1.true和false if--else if--else, while, do--while 都使用条件表达式的真假来决定执行路径. Java不允许数字作为真假判断,C和C++可以非0即真. 2. ...

  4. QT_QMAKE_EXECUTABLE reported QT_INSTALL_LIBS as /usr/lib/i386-linux-gnu but ...

    $sudo apt-get install libqt4-dev done!!!

  5. centos /home/ 目录下的中文名文件夹改为英文

    $ export LANG=en_US $ xdg-user-dirs-gtk-update 在弹出的窗口中询问是否将目录转化为英文路径,同意并关闭 在终端中输入命令: export LANG=zh_ ...

  6. POJ 3237.Tree -树链剖分(边权)(边值更新、路径边权最值、区间标记)贴个板子备忘

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 12247   Accepted: 3151 Descriptio ...

  7. UVA 12594 Naming Babies

    $dp$,斜率优化. 设$dp[j][i]$表示前$i$个位置分成$j$段的最小值,递推式很好写,预处理几个前缀和就可以了,然后斜率优化即可. #pragma comment(linker, &quo ...

  8. 【NOIP2007】字符串展开解题报告

    描述 Description 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或“4-8”的子串,我们就把它当作一种简写,输出时,用 ...

  9. Linux查看内核信息或系统信息

    先说说为什么会写这个.这是我去面试的时候面试官问的一个问题,我感觉是一个普遍会被问到的问题.为了让我自己记住,也便于收集下Linux运维方向考官的题目. 第一,查看内核信息 cat /proc/ver ...

  10. 一条命令搞定在VMware中的Ubuntu14.04 64 位安装Docker

    对,就是这么炫酷! curl -sSL https://get.docker.com/ | sudo sh 如果提示没有装curl就apt-get install一下,另外提醒一下必须是64位的ubu ...