一 建立ATL COM ,增加接口ITest和实现函数Test,增加以下函数:
idl文件:
[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文件:
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