Я пытаюсь реализовать внепроцессный COM-сервер, написанный на C#. Как мне это сделать?
Мне нужно, чтобы код C# находился «вне процесса» в моем основном приложении C++, потому что я не могу загрузить среду выполнения .NET в основное пространство процесса.
ПОЧЕМУ?:
Мой код C++ находится в DLL, которая загружается во множество различных клиентских EXE, некоторые из которых используют разные версии среды выполнения .NET. Поскольку в один процесс может быть загружена только одна среда выполнения, мне кажется, что лучше всего поместить мой код C# в другой процесс.





Я не могу рекомендовать это как способ, но вы можете создать COM-вызываемую оболочку для своей библиотеки C#, а затем создать проект VB6 ActiveX exe, который делегирует вызовы вашей библиотеке C#.
Здесь мы можем прочитать, что это возможно, но exe будет загружен как библиотека, а не запущен в своем собственном процессе, как exe. Не знаю, для тебя ли это проблема? Он также содержит некоторые возможные решения, если вы действительно хотите заставить его работать как настоящий com-сервер вне процесса. Но, возможно, лучше использовать другой способ межпроцессного взаимодействия. Как .Net Remoting.
Почему вы не можете загрузить среду выполнения .net в пространство процесса? Можно разместить среду выполнения .net и обращаться к .net с помощью COM.
Мой продукт - это библиотека DLL, которую используют другие компании. Они могут писать свои приложения с использованием различных версий среды выполнения .NET (или какого-либо инструмента, отличного от .NET). Только одна версия .NET runtiem может быть загружена в процесс за раз, поэтому я хочу избежать отдельной версии моей DLL для каждой среды выполнения .NET.
Компоненты COM + можно создавать с помощью System.EnterpriseServices.ServicedComponent. Следовательно, вы сможете создать внепроцессную и внутрипроцессную (клиентскую) активацию компонентов, а также все преимущества COM + для объединения, удаленного взаимодействия, запуска в качестве службы Windows и т. д.
Возможный дубликат Создать внепроцессный COM в C# /. Net?