Как мне использовать c # для повторной реализации старого сервера DCOM, не ломая существующих клиентов?

2

В тот же день я написал COM-сервер вне процесса (то есть EXE), используя VС++ 7.x(Visual Studio 2003 и .Net 1.1), используя библиотеку ATL. Сервер использовал модель Multi Threaded Apartment (MTA) и активирован вызовами DCOM (клиенты VB6). Несколько запросов клиентов удовлетворяются одним процессом, который активируется первым запросом (автоматически с помощью инфраструктуры COM).

Это был довольно сложный фрагмент кода, и теперь я должен внести в него некоторые изменения. К сожалению, машина, на которой я ее построила, давно ушла, и у меня возникли проблемы даже с компиляцией проекта на новой машине с VS 2003. Несколько лет назад я играл с переносом этого проекта на VS 2005, но было много нарушая изменения в библиотеке ATL, и я отказался от этих усилий.

Вместо того, чтобы решать мои текущие проблемы, связанные с созданием старого проекта VS 2003 С++, я занимаюсь переписыванием вещи в .NET. Это сделает его намного более удобным в моем небольшом магазине (где мы больше не делаем С++). Макросы ATL и идиомы С++ давно исчезли из моей памяти, и я бы хотел их оставить там.: -)

Итак, я изучаю, насколько это возможно, чтобы переписать его на С#/VS2008. Я знаю, что вы можете выставлять .NET-классы для COM-клиентов. Действительно, я делал это с некоторыми простыми вещами в прошлом. Однако это намного сложнее. Я не уверен в некоторых вещах:

  • Все интерфейсы определены в библиотеке типов, которая потребляется клиентами (которая должна оставаться немодифицированной). Могу ли я предположить, что я могу создать .NET-сервер, который реализует эти интерфейсы на основе существующей библиотеки типов?

  • Сервер реализует ряд интерфейсов, которые наследуются от IDispatch и помечены "двойным" и "олеавтоматическим". В качестве примера:

    [odl, uid(...), dual, oleautomation]
    interface IKDFTSearchManager : IDispatch {
    
            HRESULT Method1(...);
            HResult Method2(...);
    }
    

    Я не считаю, что любой из клиентов использует методы IDispatch, но я бы предположил, что VTable, сгенерированный interop, должен совпадать. Как можно разоблачить это с сервера .NET?

  • Какой тип проекта должен содержать компоненты? Консольное приложение?

  • DCOM предположительно активирует EXE, если он надлежащим образом зарегистрирован одним из инструментов взаимодействия. Это так? Будет ли инфраструктура вести себя так же, как с сервером С++/ATL, т.е. Заставить один EXE активироваться, обслуживающий несколько клиентских запросов?

  • Связанный с (4), будет ли этот сервер использовать модель Multi Threaded Apartment?

Теги:
com
interop
dcom

2 ответа

2

Начнем с того, что я рекомендую читать this (когда-либо делал полный переписывание большого С++-приложения на С#?)

Вы должны изучить ServicedComponent, который является официальным способом реализации DCOM-сервера в .NET.

Проект будет библиотекой классов, которая будет размещаться на COM +, вы можете разместить проект как услугу, также вам не нужно писать хост COM +, позаботится об этом.

Вы можете ссылаться на старый tlb (но я бы рекомендовал писать интерфейс p/invoke внутри вашего проекта) и реализовать интерфейсы.

Вам нужно будет использовать ProgIdAttribute, чтобы сохранить старый.

0

Я родом из аналогичного фона, и я могу представить, что для этого будут предприняты значительные усилия, особенно если вы вообще не хотите прикасаться к клиенту.

Существует инструмент .Net sdk, называемый Tlbexp.exe, который будет экспортировать библиотеку типов для вас на сборке .Net. Я предполагаю, что вам нужно использовать этот инструмент для запуска против новой сборки С# (dll) для создания библиотеки того же типа, что и старый COM-сервер.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню