Вызов службы C # .NET из приложения C ++? - PullRequest
2 голосов
/ 19 мая 2011

У меня есть старое приложение MFC, написанное на Visual Studio 6. В какой-то момент это будет переписано в C # .NET. Однако до этого я должен написать пару новых служб Windows для существующего приложения. Остальные были написаны на ATL. Я бы предпочел написать эти новые сервисы на C # .NET, чтобы при переписывании остальной части приложения их не было.

Будет ли возможно вызывать интерфейсы библиотек, размещенных в службе Windows .NET, из старого приложения? Если да, не могли бы вы объяснить, как.

Ответы [ 2 ]

4 голосов
/ 19 мая 2011

Я сделал именно это с приложением C ++ на основе MFC в Visual Studio 2008 и службой Windows на C .NET.

Во-первых, если вы еще не создали службы C # для Windows, у меня есть пара учебных пособий по созданию базовой инфраструктуры. первый учебник предоставляет пошаговую процедуру для создания службы и записи событий в журнал событий для конкретного приложения. Второй учебник показывает, как изменить службу для установки и удаления себя из командной строки, что я считаю очень полезным.

Во-вторых, вам нужно решить, как вы собираетесь взаимодействовать между вашим приложением MFC и службой Windows. Подойдет любая модель межпроцессного взаимодействия (IPC) - сокеты, каналы, общая память, WCF и т. Д. Поскольку вы все равно хотите перейти на .NET, я бы порекомендовал использовать Windows Communication Foundation (WCF), который является как я это сделал. В частности, я выбрал аспект именованного канала WCF для моего метода связи на основе диаграммы, показанной здесь .

Если вы пойдете по пути WCF, вы выиграете от того факта, что связь между приложением и службой основана на .NET. Таким образом, когда вы перемещаете свое приложение в .NET, механизм связи не нужно будет переписывать. В то же время хитрость заключается в том, чтобы приложение MFC использовало код WCF. Для этого напишите клиентский код WCF в сборке .NET, используя C #. Затем используйте dll C ++ для преодоления разрыва между кодом MFC и сборкой .NET. У меня еще один учебник с пошаговыми инструкциями, как это сделать.

Надеюсь, это поможет.

4 голосов
/ 19 мая 2011

Абсолютно. Вы ищете функцию .NET под названием COM-Interop.

http://msdn.microsoft.com/en-us/library/kew41ycz%28v=vs.71%29.aspx

http://msdn.microsoft.com/en-us/magazine/cc163494.aspx

Вторая ссылка имеет пример ATL.

EDIT: Основываясь на ваших отзывах в комментариях, позвольте мне остановиться на этом ...

Ах, вы правы насчет примера на этой странице.

Первая ссылка действительно, где вы хотите начать для всех деталей. Если вы перейдете по ссылкам, вы найдете эту страницу:

«Предоставление компонентов .NET Framework для COM» http://msdn.microsoft.com/en-us/library/zsfww439%28v=vs.71%29.aspx

По сути, это просто вопрос применения ряда атрибутов к вашим классам и свойствам, а затем генерации соответствующих записей реестра на клиентском компьютере (что .NET имеет инструмент для выполнения - см .: http://msdn.microsoft.com/en-us/library/bctyca52%28v=vs.71%29.aspx)

Я сам делал это несколько раз для проектов .NET, которые нужно было вызывать из VC ++ и / или VB6.

Некоторые другие ссылки, которые могут представлять интерес:

http://www.codeproject.com/KB/COM/nettocom.aspx <- прекрасный пример того, что вы пытаетесь сделать. </p>

http://www.codeproject.com/KB/COM/Universal_CCW.aspx

...