C#调用C++的COM

C#调用C++的COM

C#调用C++的COM比较简单,看下面的简单实例。

一 建立ATL COM ,增加接口ITest和实现函数Test,增加以下函数:
idl文件:
interface  ITest : IDispatch {
    [id(
1), helpstring("method ADD")] HRESULT ADD([in] LONG x, [in] LONG y, LONG* z);
    [id(
2), helpstring("method UpperCase")] HRESULT UpperCase([in] CHAR A, CHAR* B);
    [id(
3), helpstring("method LowerCase")] HRESULT LowerCase([in] BSTR A, BSTR* B);
    [id(
4), helpstring("method Change")] HRESULT Change([in] VARIANT A, [out] VARIANT* B);
}
;

ITest文件:
 MIDL_INTERFACE( " 52CA8A5C-593D-4E2E-B58F-BB6C6604EAF2 " )
    ITest : 
public  IDispatch
    
{
    
public:
        
virtual /**//* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ADD( 
            
/**//* [in] */ LONG x,
            
/**//* [in] */ LONG y,
            LONG 
*z) = 0;
        
        
virtual /**//* [helpstring][id] */ HRESULT STDMETHODCALLTYPE UpperCase( 
            
/**//* [in] */ CHAR A,
            CHAR 
*B) = 0;
        
        
virtual /**//* [helpstring][id] */ HRESULT STDMETHODCALLTYPE LowerCase( 
            
/**//* [in] */ BSTR A,
            BSTR 
*B) = 0;
        
        
virtual /**//* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Change( 
            
/**//* [in] */ VARIANT A,
            
/**//* [out] */ VARIANT *B) = 0;
        
    }
;


在Test中实现以上接口函数。

二 在C#中的使用方法

1)使用IDE中的reference来reference com,这个之前com必须先注册:


2)使用命令TLBIMP ATLCOM.tlb /out:C:\ATLCOM.dll ,然后referece生成的DLL(tblmp命令帮你注册com)。

3)TypeLibConverter
TypeLibConverter 类(位于 System.Runtime.InteropServices 命名空间中)提供了将类型库中的 coclass 和接口转换为程序集中的元数据的方法。此 API 将生成与 Tlbimp.exe 相同的元数据输出。不过,与 Tlbimp.exe 不同的是,TypeLibConverter 类可以将内存中的类型库转换为元数据。

 4)自定义包装
当类型库不可用或不正确时,一种可选的做法是在托管源代码中创建类或接口的重复定义。然后,用面向运行库的编译器来编译源代码以生成程序集中的元数据。
要手动定义 COM 类型,必须具备下列各项:

所定义的 coclass 和接口的精确描述。
可生成正确 .NET Framework 类定义的编译器,如 C# 编译器。
有关类型库到程序集转换规则的知识。

编写自定义包装是一种较少使用的高级技术。有关生成自定义包装的其他信息,请参见自定义标准包装

三 在C#的client调用COM提供的接口,我们可以看到在C#中COM的接口和函数被变换为如下:
Member of atlcom.TestClass:
public TestClass();   
public virtual void ADD(int x, int y, ref int z);
public virtual void UpperCase(sbyte A, ref sbyte B);
public virtual void Change(object A, out object B) ;  
public virtual void LowerCase(string A, ref string B);

四 更多可以参考:http://www.codeproject.com/dotnet/cominterop.asp




你可能感兴趣的:(C#调用C++的COM)