Взаимодействие между неуправляемой и управляемой C ++ DLL - PullRequest
3 голосов
/ 21 ноября 2011

В настоящее время у меня есть старая неуправляемая C ++ DLL, использующая MFC.Эта DLL имеет кучу кода, который является многопоточным и написан еще в 2003 году с использованием VC6.К сожалению, этот код больше не работает.

Мне было поручено найти альтернативный способ запуска этого многопоточного кода, чтобы он функционировал как задумано.Кто-то до меня уже переписал его на C #, и мне нужно перенести этот код C # на VC ++.Я провел небольшое исследование и понял, что могу сэкономить время в процессе переноса, просто перенеся код C # на VC ++ (используя .NET Framework).Но потом я понял, что моя старая MFC DLL не может запустить этот код .NET.

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

Я изучил совместимость COM, а также классы-оболочки.Каков наилучший способ сделать это?Есть ли уроки, которые могут помочь мне с этой задачей?(Я уже провел обширный поиск, и существует множество учебных пособий, в которых используются неуправляемые библиотеки DLL C ++ и библиотеки C #, но не так много, что относится к моей ситуации).

Как вы знаете, я не могу скомпилировать старыйDLL с / clr, так как эта DLL также размещена в старом приложении Win32.Компиляция с / clr приводит к сбою приложения, иначе это уже было бы сделано.

ДЛЯ УТОЧНЕНИЯ: мне любопытно, почему вызов функций, находящихся в C # DLL, из неуправляемой C ++ DLL через COM-взаимодействие кажется таким простым по сравнению с выполнением точно такой же вещи с использованием управляемой C ++ DLL.У меня даже есть подтверждение концепции между C # и C ++, но я никак не могу понять, как выполнять точно такую ​​же задачу с C ++.Неужели не бывает простого руководства по вызову одной простой (скажем, «Add») функции из неуправляемого C ++ в управляемый C ++?

1 Ответ

0 голосов
/ 21 ноября 2011

Если у вас есть (управляемая) DLL, независимо от языка (ей), на котором она написана, вам необходим процесс для ее запуска. Если у вас есть собственный процесс, который по какой-либо причине не должен использовать CLR, что вы не можете напрямую использовать управляемую DLL (любой код, который зависит от CLR в процессе) непосредственно из этого процесса.

Вам потребуется второй вспомогательный процесс, который запускает управляемую DLL и, например, предоставляет интерфейс COM, который может вызывать собственный процесс. (вне процесса COM-сервер)

Я изучил совместимость COM, а также классы-оболочки. Каков наилучший способ сделать это?

Не уверен, что вы имеете в виду под классами-оболочками, но внепроцессный COM-сервер для вашей управляемой DLL может помочь. (Очевидно, это довольно сложная задача для правильной регистрации и запуска / завершения вспомогательного процесса.)

Немного разобрав проблему (насколько я понимаю):

[oldish Win32 app (no! CLR)]
      <- normal DLL interface -> [native/MFC DLL (no! CLR)] 
                                                  <- via COM -> [stuff in a separate executable]

Если это то, что вы ищете, то эта статья (всего лишь быстрый ответ Google) может быть полезной:

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

Для COM в целом, я думаю, что любое руководство по COM должно охватывать то, что якобы вы пытаетесь сделать.

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