zoukankan      html  css  js  c++  java
  • C# 互操作性入门系列(五) C#中前期和后期绑定方式来调用COM对象

    本文转载自:https://blog.csdn.net/u011162260/article/details/45921139

    C#前期绑定方式来调用COM对象
      .NET框架是COM的一个自然发展,两者共享许多核心要素,这包括组件的再利用以及语言的中立性。为了向后兼容,COM Interop可以使用现存的COM组件而不要求对原始组件进行修改。当一个 .NET 框架开发人员想将COM代码合并到一个管理应用程序中时,就可以用COM Interop功能引入相关的COM类型。引入之后,这个COM类型就可以使用了。
        例子:
                Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
                excel.Application.Workbooks.Add(true);
                excel.Visible = false;
                excel.DisplayAlerts = false;
                excel.AlertBeforeOverwriting = false;
                try
                {
                    excel.Cells[1, 1] = title;
                    Microsoft.Office.Interop.Excel.Range title_size_Rng = excel.get_Range("A" + (1).ToString(), "A" + (1).ToString());
                    title_size_Rng.Font.Size = 15;
                   // title_size_Rng.ColumnWidth = 8.25;
                    //title_size_Rng.RowHeight = 25.5;
                    Microsoft.Office.Interop.Excel.Range title_type_Rng = excel.get_Range("A" + (1).ToString(), GetExcelCol(dr_ks.Length) + (1).ToString());
                    title_type_Rng.Merge(Type.Missing);
                   Microsoft.Office.Interop.Excel.Range head_Rng = excel.get_Range("A" + (1).ToString(), GetExcelCol(dr_ks.Length) + (2).ToString());
                    head_Rng.Font.Bold = true;
                    head_Rng.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
                    head_Rng.VerticalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;
             }
                finally
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
                    excel.Quit();
                    excel = null;
                    GC.Collect();
                    //invoke InvokeMothed1 = new invoke(this.SetButtonEnable);
                    //fm.Invoke(InvokeMothed1);
                }

    C#后期绑定方式来调用COM对象
     

    实际应用当中,可能有的时候需要用到后期绑定方式来调用COM对象。
    1、静态方法System.Type.GetTypeFromProgID 方法 (String),该方法可获取与指定程序标识符 (ProgID) 关联的类型,如果在加载 Type 时遇到错误,则返回空值。通过它可获取对代表COM对象类型的Type对象的引用。此方法是专为 COM 组件支持提供的。
    2、静态方法System.Activator.CreateInstance(),使用与指定参数匹配程度最高的构造函数创建指定类型的实例。
    这里使用Activator.CreateInstance()创建COM对象的一个实例。
    3、System.Type类的非静态方法InvokeMember()可以创建一个在编译期间未知的类的实例,只需要在调用的时候使用BindingFlags枚举量中的SetProperty值即可对com对象的公共属性进行操作。
    InvokeMember方法的5个参数如下:  
      1)要调用的成员的名称。String,它包含要调用的构造函数、方法、属性或字段成员的名称;空字符串 (""),表示调用默认成员;对于 IDispatch 成员,则为一个表示 DispID 的字符串,例如“[DispID=3]”。
      2)BindingFlag枚举的值,表明调用的是属性还是方法等。这个位屏蔽,由一个或多个指定搜索执行方式的 BindingFlags 组成。访问可以是 BindingFlags 之一,如 Public、NonPublic、Private、InvokeMethod 和 GetField 等。不需要指定查找类型。如果省略查找类型,则将应用 BindingFlags.Public |BindingFlags.Instance。
      3)一个 Binder 对象,该对象定义一组属性并启用绑定,而绑定可能涉及选择重载方法、强制参数类型和通过反射调用成员。通常使用默认Binder 对象,即传递一个null值;
      4)对Com对象本身的引用;
      5)包含传递给要调用的成员的参数的数组。即希望给Com方法发送的输入参数数组。
    以下是测试代码,调用Word的com组件,并设置它的可视属性。

      oobject comObject;            
      .Type comObjectName;           
       //参数            
      object[] args = new object[1];           
       //要获取的类型的 ProgID。             
      string progID = "Word.Application";            
      //与指定 ProgID 关联的类型,即获取相应的Com对象            
      comObjectName = System.Type.GetTypeFromProgID(progID);            
      //创建Com的实例            if (comObjectName != null)            
      {                
        comObject = Activator.CreateInstance(comObjectName);               
         //设置需要设置的参数值                
        args[0] = true;                
        //设置可视属性,显示Word窗体                
        comObjectName.InvokeMember("Visible", BindingFlags.SetProperty, null, comObject, args);            
      }
    以下是调用方法示例(关闭刚才创建的Word窗体)
           args = new object[3];           
      comObjectName.InvokeMember("Quit", BindingFlags.InvokeMethod, null, comObject, args);
  • 相关阅读:
    POJ 3579 Median (二分)
    POJ 2976(01分数划分+二分)
    CodeForces
    hdu3555 Bomb(数位dp)
    hdu 2476 String painter(区间dp)
    poj 2955 Brackets(区间dp)
    HDU 2665(主席树,无修改第k小)
    BNUOJ ->Borrow Classroom(LCA)
    poj 2763(在线LCA+树状数组)
    Jmeter-常用线程组设置及场景运行时间计算
  • 原文地址:https://www.cnblogs.com/hanguoshun/p/12778995.html
Copyright © 2011-2022 走看看