您的位置:首页 > 编程语言 > C语言/C++

C#调用C++的COM组件简单示例

2009-11-21 16:31 691 查看
一 建立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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: