知识大全 C#中COM操作(一)---实例化[2]
Posted 知
篇首语:真正的知识使人真正地、实实在在地胜过他人。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#中COM操作(一)---实例化[2]相关的知识,希望对你有一定的参考价值。
C#中COM操作(一)---实例化[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
直接声明空成员的类
可能很多程序员对于这个不太理解这是什么意思 没关系咱还是 用代码来说话
[ComImport Guid( DE C FF C D BB F C FAE DA )] public class JetEngineClass [ComImport CoClass(typeof(JetEngineClass)) Guid( F D FF D BB F C FAE DA )] public interface IJetEngine void CompactDatabase( [In MarshalAs(UnmanagedType BStr)] string SourceConnection [In MarshalAs(UnmanagedType BStr)] string Destconnection ); void RefreshCache([In MarshalAs(UnmanagedType Interface)] object Connection); JetEngineClass engine = new JetEngineClass(); IJetEngine iengine = engine as IJetEngine; // iengine即是所要用的接口的引用大家看到了上面声明的JetEngineClass类只有一个单单的类声明 但是没有一个成员声明 但是和一般的类声明有些不一样的是这个类多了两个特性(Attribute) 把这个类和对象联系在一起的就是这两个特性了 其中一个是ComImportAttribute 这个特性指明了所作用的类是从对象中来的 GuidAttribute指明了对象的GUID 也就是说明了创建这个需用到的GUID 有了这两个特性以后 这个类就不是一个普通的类了 当我们使用new去创建实例的时候 CLR看到了声明的这两特性就知道要创建的是一个对象 根据提供的GUID也就能创建出指定的对象 并和new返回的对象实例关联在一起了
终上 种方法我们可以看出来 第一种方式只对特定的对象有效 不具有通用性 第二种方式只需要知道对象的CLSID或PROGID就可以了 是我们在 NET里平时比较常用的创建对象的方法 第三种方式需要自己声明一个外部方法 而且需要传入若干的参数 还需要知道对象模型 是单线程呢还是多线程 进程内呢还是进程外 两个字 麻烦 对CoCreateInstance这个方法不是很熟悉的人来说 用起来就不那么顺手了 第四种方式用起来最像是 NET的方式 也最简单省事 和其它 NET对象的创建方式最为接近 四种方法各有各有好处 我觉得简单的对象 用第二种和第四种是最好的(我个人来说最喜欢第四种)又不生成额外的程序集 要是对象相关的比较多 比如说Excel之类的对象 我建议还是用导入类型库包装吧 虽然是有可能出现版本问题 但这种应该很容易要求目标机器上运行的版和开发的时候一致的 更何况版本问题也不是 %出现 只是很少一部分会出这样的问题 最不推荐的就是第三种方式了 这种方式在我看来唯一用到的地方就是使用IntPtr作为对象和接口的指针的时候 或者是想要在创建对象的时候 对参数作最灵活的控制的时候 因为其它三种方式既不能返回IntPtr指针(其实也可以通过前面提到的的Marshal类的方法把 NET包装的对象转成指针) 也不能提供与直接调用CoCreateInstance函数提供最全面的参数相匹配的方式
最后提个小问题
读者有兴趣的话可以去看看这几种方式(不包括第三种)生成的对象的引用的类型是否是一致的 也就是用GetType得到的Type是否是一致的
大家猜猜这段代码运行后 iengine的类型会是什么(GetType的结果) 会和engine的类型一样吗?
JetEngineClass engine = new JetEngineClass(); IJetEngine iengine = engine as IJetEngine; // iengine即是所要用的接口的引用 IntPtr p = Marshal GetIUnknownForObject(engine); iengine = Marshal GetObjectForIUnknown(p) as IJetEngine;我这里就不给出结果了 留给读者自行去验证吧 另外如果大家还发现 NET中有其它的创建对象的方式也尽指教一二 本人将不甚感激
cha138/Article/program/net/201311/15279相关参考
C#中COM操作(一)---实例化[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 用C#做
C#中让程序只运行一个实例的操作方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 让程序只运行
新建类库MyTestDLL 右击项目“MyTestDLL”》属性》生成》勾选“为互操作注册” 打开 AssemblyInfocs&nb
编程中使用C#的BitmapData实例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 最近要转
知识大全 Visual C#中实现DB2数据库的编程实例[2]
VisualC#中实现DB2数据库的编程实例[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!t
C#多线程编程实例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 问题的提出 所谓单个写入程序
C#数据回滚实例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! privatevoidsave_
使用C#的BitmapData编程实例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 最近要转开
C#高级编程读写文本文件实例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 理论上可以使用Fil
C#使用BerkeleyDB操作简介[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Ber