C#与DLL和COM的混合编程(2)-C#调用COM组件

翻译 2006年06月17日 01:08:00
C#调用COM组件
这部分描述了在托管代码中调用COM组件的方法,
现存的COM组件在托管代码中作为中间件或者独立的功能实体是很有价值的资源
 
 
.NET Framework报露COM组件
1. Import a type library as an assembly
COM的类型定义通常在type librarytlb)中,与之对应的是CLS兼容的编译器在assembly中产生类型元数据(type metadata),这两种类型信息的来源有很大的不同
 
Generating Metadata
COM的类型库(type libraries)可以是一个单独得Tlb文件,例如Loanlib.tlb。一些类型库被嵌入到DLL或者Exe的资源文件中,还有一些类型库在OLB或者OCX中。
找到包含你的COM类型的类型库之后,可以有以下的选择来生成包含元数据的交互程序集(interop assembly
 
Option
Description
Visual Studio .NET
Automatically converts COM types in a type library to metadata in an assembly.
Type Library Importer
Provides command-line switches to adjust metadata in the resulting interop file, imports types from an existing type library, and generates an interop assembly and a namespace.
TypeLibConverter Class
Exposes methods that perform conversion-related actions. Can convert in-memory type library information to metadata.
Custom Wrappers
As a less desirable option, you can create type definitions from scratch. This requires advanced programming skills.
 
当添加一个给定的type library 的引用(reference)时,Visual Studio .NET生成包含元数据的交互程序集(interop assembly)。如果一个主交互程序集(primary interop assembly)有效的话,Visual Studio使用存在的assembly
To add a reference to a type library
1.      Install the COM DLL or EXE file on your computer, unless a Windows Setup.exe performs the installation for you.
2.      From the Project menu, select References.
3.      Select the COM tab.
4.      Select the type library from the Available References list, or browse for the TLB file.
5.      Click OK. 
Type Library Importer
The Type Library Importer (Tlbimp.exe)是一个命令行的工具,它可以把COM的类型库中的Coclassedinterfaces转换成元数据。
使用方法:
tlbimp Loanlib.dll
TypeLibConverter Class
TypeLibConverter classin the System.Runtime.InteropServices namespace)提供了转换类型库中的coclassesinterfaces到元数据的方法。
Custom Wrappers
当一个类型库不可用或者不正确时,一个可选的方法就是在托管代码重创建一个class或者interface定义的副本。然后编译代码在runtime在程序集中产生元数据
手动定义COM类型,必须遵循如下
       准确的描述定义的coclassesinterfaces
       一个编译器,例如C#编译器可以生成对应的.NET Framework的类的定义
       type library-to-assembly转化规则的相关知识
写一个自定义的包装类(wrapper)是一项应该很少使用的高级的技术。
 
2.      Using COM Types in Managed Code
 
COM 在程序集中类型定义类似其他的托管代码。托管的客户可以使用通常的方式创建COM类型的新的实例并且像其他托管类一样通过元数据得到类的信息。方法的语法可以通过object viewer或者反射(reflection)得到。当COM的方法返回一个失败的结果时,.NET的客户得到一个对应的异常。
得到或者释放一个运行的COM对象的引用像得到或者释放其他的运行的托管对象的引用一样。当一个.NET的客户端得到或者释放COM对象的引用,运行时像其他的COM客户端那样维护COM对象的引用计数,.NET的客户端可以认为对象可以像其他的托管对象那样被垃圾收集。
下面是C#的客户端代码
[C#]
using System;
using LoanLib;
 
public class LoanApp {
   public static void Main(String[] Args) {
 
      Loan ln = new Loan();
      if (Args.Length < 4)
      {
         Console.WriteLine("Usage: ConLoan Balance Rate Term Payment");
         Console.WriteLine("    Either Balance, Rate, Term, or Payment
            must be 0");
         return;
      }
      ln.OpeningBalance = Convert.ToDouble(Args[0]);
      ln.Rate = Convert.ToDouble(Args[1])/100.0;
      ln.Term = Convert.ToInt16(Args[2]);
      ln.Payment = Convert.ToDouble(Args[3]);
     
      if (ln.OpeningBalance == 0.00) ln.ComputeOpeningBalance();
      if (ln.Rate == 0.00) ln.ComputeRate();
      if (ln.Term == 0) ln.ComputeTerm();
      if (ln.Payment == 0.00) ln.ComputePayment();
 
      Console.WriteLine("Balance = {0,10:0.00}", ln.OpeningBalance);
      Console.WriteLine("Rate    = {0,10:0.0%}", ln.Rate);
      Console.WriteLine("Term    = {0,10:0.00}", ln.Term);
      Console.WriteLine("Payment = {0,10:0.00}/n", ln.Payment);
      bool MorePmts;
      double Balance = 0.0;
      double Principal = 0.0;
      double Interest = 0.0;
      Console.WriteLine("{0,4}{1,10}{2,12}{3,10}{4,12}", "Nbr", "Payment",
        "Principal", "Interest", "Balance");
      Console.WriteLine("{0,4}{1,10}{2,12}{3,10}{4,12}", "---", "-------",
        "---------", "--------", "-------");
      MorePmts = ln.GetFirstPmtDistribution(ln.Payment, out Balance,
        out Principal, out Interest);
      for (short PmtNbr = 1; MorePmts; PmtNbr++) {
         Console.WriteLine("{0,4}{1,10:0.00}{2,12:0.00}{3,10:0.00}
           {4,12:0.00}", PmtNbr, ln.Payment, Principal, Interest,
            Balance);
         MorePmts = ln.GetNextPmtDistribution(ln.Payment, ref Balance,
           out Principal, out Interest);
      }
    }
}

C#通过COM组件调用C++的代码(转载)

一.通过ALT建立COM组件 1、创建ATL Project 步骤1:建立一个解决方案。    步骤2:在 该解决方案中,新建一个 vc++ 的 ATL 项目。见下图 选择Dynamic-...
  • taiyang1987912
  • taiyang1987912
  • 2016年05月19日 10:32
  • 1179

C++和C#相互调用COM组件的方法简介

 1、在VS2005中,C#编写DLL并使用C++调用 2、在VS2005中C#编写的COM组件,使用VC6.0调用 3、在VC6.0中编写COM组件,使用VS2005 ...
  • u011555996
  • u011555996
  • 2017年07月25日 15:28
  • 1020

C#与DLL和COM的混合编程(2)-C#调用COM组件

C#调用COM组件这部分描述了在托管代码中调用COM组件的方法,现存的COM组件在托管代码中作为中间件或者独立的功能实体是很有价值的资源  向.NET Framework报露COM组件1. Impor...
  • Net_Ghost
  • Net_Ghost
  • 2006年06月17日 01:08
  • 5345

.NET调用Com组件事例

在程序设计中,往往通过键盘的某个按键来完成相关操作!  下面就来说明如何实现: 1.引入名称空间;using System.Runtime.InteropServices;(由于使用到API(user...
  • shizhiyingnj
  • shizhiyingnj
  • 2007年02月11日 23:23
  • 7262

C#如何编写调用COM组件的程序

VS C#.net如何编写调用COM组件的程序? 请给出一个开发过程的例子. 我引用了一个MS 的Rich Edit的Com组件,在WebForm1.aspx中却没有该组件的名称,我给组件一个Id(R...
  • soonsnipe
  • soonsnipe
  • 2007年06月06日 10:01
  • 2275

C# 互操 调用COM组件

本专题概要: 引言如何在C#中调用COM组件——访问Office 互操作对象在C# 中调用COM组件的实现原理剖析错误处理小结   一、引言   COM(Component Object ...
  • leilonghao
  • leilonghao
  • 2016年09月30日 09:21
  • 784

c#中调用com组件

  • 2008年07月23日 16:55
  • 214B
  • 下载

用C++写COM组件并用C#调用

1、以管理员身份打开vs,特别重要,否则会不成功2、新建一个c++ ATL项目,如图,全部为默认设置 3、添加一个ATL简单对象,从添加类中添加,如图 4、添加一个方法,注意是在类视图中添加,...
  • qq_22033759
  • qq_22033759
  • 2015年09月01日 00:15
  • 2959

C#中调用COM对象

C#中调用COM对象
  • u011162260
  • u011162260
  • 2015年05月22日 20:42
  • 1719

C# 通过反射调用com组件

  • 2017年10月08日 20:32
  • 5KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#与DLL和COM的混合编程(2)-C#调用COM组件
举报原因:
原因补充:

(最多只允许输入30个字)