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 ...
随机推荐
- (转)Oracle中判断某字段不为空及为空的SQL语句
比如 insert into table a (a1,b1)values("a1",''); 对于这种情况,因为表里存的是'',其实是没有内容的,要查询这个字段,不能直接使用 se ...
- BZOJ1003: [ZJOI2006] 物流运输 trans
物流运输--看了神犇的题解,就是dp+最短路,设f[i]为1~i天的最少花费,那么 dp[i]=min(cost[1,i],min{dp[j]+cost[j+1,i]+K,1≤j<i}) 就是从 ...
- 判断 js 的 Array 和 Object
https://my.oschina.net/ohcoding/blog/470952?p=1 var a = ['hello','world']; console.log(typeof a); // ...
- vue+axios下载文件的实现
HTML代码: <el-button size="medium" @click="download">下载表格</el-button> ...
- 层级数据模板 案例(HierarchicalDataTemplateWindow)
1.xaml 文件 <Window x:Class="DataTemplate.HierarchicalDataTemplateWindow" xmlns=&q ...
- OleDbDataAdapter具体使用11
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- tarjan算法和Kosaraju算法
tarjan算法和Kosaraju算法是求有向图的强连通分量的算法: #include<iostream> #include<cstring> using namespace ...
- PYTHON代理IP
import urllib.request url = 'http://www.whatismyip.com.tw/' proxy_support = urllib.request.ProxyHand ...
- 利用return中断function
想实现通过点击button实现文字样式的交替改变,在实现function的中断过程中遇到了一些问题,所幸解决了 <!doctype html> <html lang="en ...
- css “裁剪”图片(显示图片的一部分)
背景:朋友有一个需求,就是列表页显示的图片要做裁剪,不然不按比例缩小图片看起来就变形了.本来想好的解决办法是用PHP来生成缩略图,然而试了好几个开源缩略图类都没有一个满意的,突然想到为什么不直接用CS ...