COM - 在ATL C ++项目中使用IEnumerable

时间:2011-09-13 09:15:20

标签: com

我在我的C ++ COM服务器中使用一个C#COM DLL,它实现IEnumerable以迭代集合。

  1. 如何在我的本机代码中指定我想要访问IEnumerable - >来自C#Dll的实例对象的GetEnumerator()方法?我是否必须导入一些* .tlb才能在我的C ++项目中看到IEnumerable接口?我看到的Ienumerable接口是由mscorelib.dll

  2. 定义的
  3. 我是否可以进一步向客户端公开IEnumerable接口(在我的C +项目中的IDL中定义)。一个例子很有帮助

1 个答案:

答案 0 :(得分:4)

它由类型库导出器自动翻译,System.Collections.IEnumerator是[ComVisible]并被转换为IEnumVARIANT。例如:

using System;
using System.Collections;
using System.Runtime.InteropServices;

[ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IExample {
    IEnumerator GetEnumerator();

}
[ComVisible(true), ClassInterface(ClassInterfaceType.None)]
public class Example : IExample {
    public IEnumerator GetEnumerator() {
        yield return 42;
    }
}

转换为此类型库片段:

// TLib :     // TLib : mscorlib.dll : {BED7F4EA-1A96-11D2-8F08-00A0C9A6186D}
importlib("mscorlib.tlb");
// TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
importlib("stdole2.tlb");

// Forward declare all types defined in this typelib
interface IExample;

[
  odl,
  uuid(9B046FDE-9234-3DE7-B055-DADE8F7B4A99),
  version(1.0),
  dual,
  oleautomation,
  custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "IExample")    

]
interface IExample : IDispatch {
    [id(0xfffffffc)]
    HRESULT GetEnumerator([out, retval] IEnumVARIANT** pRetVal);
};

请注意mscorlib.tlb的importlib指令,该指令存在于c:\ windows \ microsoft.net \ framework \ v2.0.50727中,编译器在没有帮助的情况下找到它。