知识大全 C#中COM操作(一)---实例化[1]

Posted

篇首语:永不毁灭的无价之宝,是一个的学问。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#中COM操作(一)---实例化[1]相关的知识,希望对你有一定的参考价值。

C#中COM操作(一)---实例化[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  用C#做WinForm程序 时间长了难免会遇到和组件打交道的地方 用什么方式创建对象也成了我们必须面对的一个问题 据我所知道的创建对象的方法一共有以下几种:

   使用 NET包装组件

  这是最简单的就是导入组件所在的DLL 让IDE生成 NET一个IL包装加到项目中 这样原来里面所有实现了IDispatch Dual的类型及其相关类型就可以直接在 NET程序里面使用 比如以前在 时代 想要写自己的基于IE的浏览器 就得手动加入与IWebBrowser 接口相关的DLL 这种方式是大家最常用的 也是最傻瓜化的 因此也没什么可解释的

  但是这种方式有个至命的缺点——不是所有的对象都能用这种方式导出 正如前面所说的 只有实现了IDispatch Dual类型的接口才支持被导出 而且面对不同版本的或许会生成不一样的导出DLL 比如说A机器上写代码时导入了一个Jet 版本的包装DLL 代码编译了拿到B机器上去运行 但是B机器上的Jet版本是 的 就可能会出现运行时错误

   用反射动态创建

  包括使用Type GetTypeFromCLSID和Type GetFromProgID两种方法获取对象的Type再创建 这种方式也好理解 就是说使用这两个方法之前 必须得知道对象的GUID或ProgID 好在这也不是什么难事 一般我们要使一个对象 多多少少都了解一些这个对象的GUID或ProgID信息 用这种方获取到了一个Type对象后 就可以用 NET里面通用的反射创建对象的方法来做了

  这里给出一个创建JetEngine 的对象的代码实例:

  public object GetActiveXObject(Guid clsid)         Type t = Type GetTypeFromCLSID(clsid);       if (t == null) return null;         return Activator CreateInstance(t);      Guid g = new Guid( DE C FF C D BB F C FAE DA ); // JetEngine object jet = GetActiveXObject(g);

  是不是觉得最后调用GetActiveXObject(g)的地方和IE里面Javascript里面用new ActiveXOjbect创建对象的方法很相像?

   声明CoCreateInstance外部函数 用这个函数去创建相应的实例

  M$在 里面包装的WebBrowser控件内部就是用这个函数去创建的 使用这种方式创建 就跟在C++里面不什么两样了 有一点需要说明的是 一般我们在代码中引入外部方法的时候 方法的参数和返回值的类型不一定是唯一的一种 只要在逻辑上相互能转化 一般都可以使用

  比如说如下几种声明都是正确的: 

  [return: MarshalAs(UnmanagedType Interface)]  [DllImport( ole dll ExactSpelling=true PreserveSig=false)]  public static extern object CoCreateInstance([In] ref Guid clsid        [MarshalAs(UnmanagedType Interface)] object punkOuter int context [In] ref Guid iid);       [DllImport( ole dll ExactSpelling=true PreserveSig=false)]  public static extern IntPtr CoCreateInstance([In] ref Guid clsid        IntPtr punkOuter int context [In] ref Guid iid);   [DllImport( ole dll ExactSpelling=true)] public static extern int CoCreateInstance([In] ref Guid clsid      IntPtr punkOuter int context [In] ref Guid iid [Out] out IntPtr pVoid); [DllImport( ole dll ExactSpelling=true)] public static extern int CoCreateInstance([In] ref Guid clsid      [MarshalAs(UnmanagedType Interface)] object punkOuter int context      [In] ref Guid iid [MarshalAs(UnmanagedType Interface) Out] out object pVoid);

  甚至于当你有里面对应的接口类型的声明的时候 完全可以把上面的object或IntPtr换成相应的接口类型 前提是你的接口类型的声明一定要正确 读者中用C++做过的一定对这种方式记忆犹新吧 只不过这里不再需要什么CoInitialize和CoUninitialize NET内部自己帮你搞定了 顺便提一下 上面例子中的object与IntPtr声明是相通的 我们可以用Marshal GetObjectForIUnknown和Marshal GetIUnknownForObject这两个方法在object和IntPtr之间互转 前题当然是这两种方式所指向的都是对象才行 这种方式提供的传入参数最多 创建对象也最灵活

cha138/Article/program/net/201311/15280

相关参考

知识大全 C#中COM操作(一)---实例化[2]

C#中COM操作(一)---实例化[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  直接声明

知识大全 C#中让程序只运行一个实例的操作方法

C#中让程序只运行一个实例的操作方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  让程序只运行

知识大全 asp调用c#编制的com组件实例

 新建类库MyTestDLL  右击项目“MyTestDLL”》属性》生成》勾选“为互操作注册”  打开 AssemblyInfocs&nb

知识大全 编程中使用C#的BitmapData实例

编程中使用C#的BitmapData实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  最近要转

知识大全 C#多线程编程实例

C#多线程编程实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  问题的提出  所谓单个写入程序

知识大全 Visual C#中实现DB2数据库的编程实例[1]

VisualC#中实现DB2数据库的编程实例[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 C#数据回滚实例

C#数据回滚实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  privatevoidsave_

知识大全 使用C#的BitmapData 编程实例

使用C#的BitmapData编程实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  最近要转开

知识大全 C#高级编程读写文本文件实例

C#高级编程读写文本文件实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  理论上可以使用Fil

知识大全 C#接口基础知识实例讲解

C#接口基础知识实例讲解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  从技术上讲接口是一组包含