代码之家  ›  专栏  ›  技术社区  ›  Ben McCormack

从包装的COM组件公开枚举

  •  0
  • Ben McCormack  · 技术社区  · 16 年前

    我正在.NET中编写一个类库,该类库包装了一个COM dll并公开了其他.NET代码使用的特定功能。COM库定义了几个枚举,我使用了一些枚举类型作为参数,如下所示:

    //C#
    public void TransactionTypeSetByEnum(COMComponent.TransactionType transType)
    {
        this.TransactionType = transType
    }
    
    'VB.NET'
    Public Sub TransactionTypeSetByEnum( _
      ByVal transType As COMComponent.TransactionType)
        Me.TransactionType = transactionType
    End Sub
    

    但是,当我从另一个项目使用这个.NET包装器时,编译器看不到COM类型(我不想将它们公开给consuming类)。例如。。。

     netWrappedObject.TransactionTypeSetByEnum( //...No intellisense for the enum
    

    有没有办法在.NET包装器库中公开底层非托管枚举,而不添加非托管DLL引用负责使用该库的项目?


    其他背景信息:

    该企业已经有工作的VB6代码,这些代码已经编译成COM组件。业务不想重写.NET托管代码中的那些组件,但希望能够在.NET应用程序中使用现有代码。与其让每个.NET应用程序直接拖动COM组件,我的目标是在现有的COM组件周围写一个.NET“包装器”,并用类和接口向其他.NET应用程序公开所需的功能。

    在我上面的问题中,我的问题是COM dll有几个 enum 我想暴露 通过 “包装”该DLL的.NET组件。假设COM dll有一个名为 ComFoo 它有一个枚举调用 ComFooEnum . 我想要 NetFoo 以某种方式暴露 ComFooEnum公司 当其他项目消耗 . 我不希望其他项目被要求参考 康福 只是为了能看到 暴露于 网孚 . 如果我不得不模仿 做一个新的 NetFooEnum

    下面是一个图表,它试图解释我要实现的封装:

    ______________________________  
    |                            |  
    | Compiled VB6 COM Assembly  |  
    |  Exposes class called      |  
    |     ComFoo                 |  
    |____________________________|   
                            ||
    _____________________   ||
    |                   |   ||
    | Existing VB6      |   ||
    | Business          |  < |
    | Application       |   ||
    | references ComFoo |
    |___________________|
    
    //The business is building new applications in .NET
    //that need to consume ComFoo, which cannot be rewritten.
    //NetFoo exposes the functionality of ComFoo.
    
    ____________________________________
    |                                  |
    |        .NET Wrapper Assembly     |
    |    Exposes class called NetFoo   |
    |  ______________________________  |
    |  |                            |  |
    |  | Compiled VB6 COM Assembly  |  |
    |  |  Exposes class called      |  |
    |  |     ComFoo                 |  |
    |  |____________________________|  |
    |__________________________________|
                            ||
    _____________________   ||
    |                   |   ||
    | New .NET Business |  < |
    |  Order Entry App  |   ||
    | references NetFoo |   ||
    |___________________|   ||
                            ||
    _____________________   ||
    |                   |   ||
    | New .NET Business |   ||
    |  Internet App     |  < |
    | references NetFoo |   ||
    |___________________|   
    
    1 回复  |  直到 16 年前
        1
  •  1
  •   Hans Passant    16 年前

    这里没有魔法。就像用等效的.NET类型包装COM组件中的接口类型一样,也必须包装类型库中的其他声明。如果不想公开COM枚举类型,则必须包装它们。使用.NET枚举类型声明。代码通过int转换很简单,但它是一个维护项。就像.NET类包装器一样。确保包装COM类型有实际的附加值,一对一映射很少有用。

    除非这是最终替换COM服务器的训练轮。好吧,这会让你对所需要的东西有一个很好的感觉。在这种情况下你真的 做 要声明枚举。