Создание сервера автоматизации COM в C # - PullRequest
9 голосов
/ 18 ноября 2009

В настоящее время у меня есть библиотека классов .NET, написанная на C #, которая показывает свою функциональность через COM для программы C ++ (до .NET).

Теперь мы хотим вывести библиотеку из процесса, чтобы освободить адресное пространство в основном приложении (это приложение для обработки изображений, а большие изображения поглощают адресное пространство). Из моих дней VB6 я помню, что можно было создать «сервер автоматизации OLE». ОС автоматически запускает и останавливает сервер .exe при создании / уничтожении объектов. Это выглядит идеально для нас: насколько я вижу, в клиенте ничего не изменится, за исключением того, что он вызовет CoCreateInstance с CLSCTX_LOCAL_SERVER вместо CLSCTX_INPROC_SERVER.

Как бы я создал такой сервер вне процесса в C #? Либо в Интернете нет информации об этом, либо моя терминология устарела / устарела!

Ответы [ 3 ]

6 голосов
/ 19 ноября 2009

На самом деле вы можете сделать это в .NET (я уже делал это в качестве подтверждения концепции), но это немного работы, чтобы все заработало правильно (время жизни процесса, регистрация и т. Д.).

Создайте новое приложение для Windows. В методе Main вызовите RegistrationServices.RegisterTypeForComClients - это управляемая оболочка CoRegisterClassObject, которая заботится о фабрике классов. Передайте ему тип управляемого класса ComVisible (тот, который вы на самом деле хотите создать - .NET автоматически предоставляет фабрику классов) вместе с RegistrationClassContext.LocalServer и RegistrationConnectionType.SingleUse. Теперь у вас есть очень простой exe-файл, который можно зарегистрировать как LocalServer32 для активации COM. Вам все равно придется определить время жизни процесса (внедрить refcounts для управляемых объектов с помощью конструкторов / финализаторов - когда вы достигнете нуля, вызовите UnregisterTypeForComClients и выйдите) - вы не можете позволить Main завершиться, пока все ваши объекты не умрут.

Регистрация не так уж и плоха: создайте атрибутивный метод ComRegisterFunction, который добавляет ключ LocalServer32 в HKLM \ CLSID (yourclsidhere), значением по умолчанию которого является путь к вашему exe-файлу. Запустите regasm yourexe.exe / codebase / tlb, и все готово.

2 голосов
/ 19 ноября 2009

Вы всегда можете представить свой класс .NET как COM-классы, используя InteropServices, а затем настроить библиотеку как приложение COM +. Библиотека .NET будет работать вне процесса и будет размещена экземпляром DLLHOST.EXE.

1 голос
/ 28 января 2010

Вот статья в MSDN, которая охватывает все аспекты создания COM-сервера COM в c # (.net): ссылка

...