从包装的COM组件中公开枚举

时间:2010-09-03 19:10:58

标签: c# .net vb.net com interop

我正在.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类型(我不想将它们暴露给消费类)。例如......

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

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


其他背景资料:

该企业已经有了已经编译成COM组件的VB6代码。该企业不希望在.NET托管代码中重写这些组件,但希望能够在.NET应用程序中使用该现有代码。我的目标是围绕现有的COM组件编写.NET“包装器”,并将类和接口所需的功能公开给其他.NET应用程序,而不是让每个.NET应用程序直接引入COM组件。

我使用界面设计来包装COM dll的部分思考是这样的:如果企业稍后决定将现有的COM dll重写为100%托管的.NET代码会更好,我只需要do是使用新代码实现接口并更改现有应用程序以引用新程序集并可能更改一行代码。这样就不必为每个.NET应用程序重写COM dll的实现。

在我上面的问题中,我的问题是COM dll有几个enum我希望通过通过暴露“包装”该DLL的.NET组件。假设COM dll有一个名为ComFoo的类,它有一个枚举调用ComFooEnum。当其他项目消耗NetFoo时,我希望ComFooEnum类以某种方式公开NetFoo。我不希望其他项目引用ComFoo只是为了能够看到enum公开的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 个答案:

答案 0 :(得分:1)

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

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