Взаимодействие между неуправляемой и управляемой библиотекой DLL C++


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

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

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

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

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

Чтобы пояснить: мне любопытно, почему вызывающие функции находятся в DLL C# из неуправляемой библиотеки DLL C++ через COM-взаимодействие кажется таким простым по сравнению с выполнением того же самого с помощью управляемой библиотеки DLL C++. У меня даже есть доказательство концепции между C# и C++, но я не могу за всю свою жизнь начать понимать выполнение той же самой задачи с C++. Существует ли простой учебник для вызова только одной простой (скажем, "Add") функции из неуправляемого C++ в управляемый C++?

1 2

1 ответ:

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

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

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

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

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

[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-учебник должен охватывать то, что вы предположительно пытаетесь сделать.