В тот же день я написал 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?
Начнем с того, что я рекомендую читать this (когда-либо делал полный переписывание большого С++-приложения на С#?)
Вы должны изучить ServicedComponent, который является официальным способом реализации DCOM-сервера в .NET.
Проект будет библиотекой классов, которая будет размещаться на COM +, вы можете разместить проект как услугу, также вам не нужно писать хост COM +, позаботится об этом.
Вы можете ссылаться на старый tlb (но я бы рекомендовал писать интерфейс p/invoke внутри вашего проекта) и реализовать интерфейсы.
Вам нужно будет использовать ProgIdAttribute, чтобы сохранить старый.
Я родом из аналогичного фона, и я могу представить, что для этого будут предприняты значительные усилия, особенно если вы вообще не хотите прикасаться к клиенту.
Существует инструмент .Net sdk, называемый Tlbexp.exe, который будет экспортировать библиотеку типов для вас на сборке .Net. Я предполагаю, что вам нужно использовать этот инструмент для запуска против новой сборки С# (dll) для создания библиотеки того же типа, что и старый COM-сервер.