Предоставить перечисление из обернутого компонента COM - PullRequest
0 голосов
/ 03 сентября 2010

Я пишу библиотеку классов в .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, ссылающейся на проект, который отвечает за использование этой библиотеки?


Дополнительная справочная информация:

В бизнесе уже есть рабочий код VB6, который был скомпилирован в компонент COM. Компания не хочет переписывать эти компоненты в управляемом коде .NET, но хочет иметь возможность использовать этот существующий код в приложении .NET. Вместо того, чтобы каждое приложение .NET извлекало COM-компонент напрямую, моя цель - написать «обертку» .NET вокруг существующего COM-компонента и предоставить необходимую функциональность с классами и интерфейсами для другого приложения .NET.

Часть моего размышления о том, как использовать дизайн интерфейса для упаковки COM-библиотеки DLL, заключается в следующем: если бизнес решит позже, что было бы лучше переписать существующую COM-библиотеку DLL, чтобы она была на 100% управляемым .NET-кодом, все, что мне нужно было бы do - реализовать интерфейс с новым кодом и изменить существующие приложения для ссылки на новую сборку и, возможно, изменить одну строку кода. Это позволяет избежать необходимости переписывать реализацию библиотеки DLL для каждого приложения .NET.

В моем вопросе выше моя проблема заключается в том, что в COM-библиотеке есть несколько enum s, которые я хочу показать через .NET-компонент, который «оборачивает» эту DLL. Допустим, у COM-библиотеки есть класс с именем 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 Ответ

1 голос
/ 04 сентября 2010

Здесь нет магии.Подобно тому, как вы оборачиваете типы интерфейса из COM-компонента эквивалентными типами .NET, вы должны обернуть другие объявления из библиотеки типов.Если вы не хотите показывать типы перечислений COM, то вам нужно обернуть их.С объявлением типа перечисления .NET.Код прост, приведя через int, но это элемент обслуживания.Так же, как обертки класса .NET.Удостоверьтесь, что при обертывании типов COM добавляется реальная добавленная стоимость, сопоставление «один к одному» редко бывает полезным.

Если только это не обучающие колеса для возможной замены сервера COM.Что хорошо, это дает вам хорошее представление о том, что нужно.В этом случае вы действительно делаете хотите объявить перечисление.

...