MFC Dll с интерфейсом COM - PullRequest
       37

MFC Dll с интерфейсом COM

2 голосов
/ 27 апреля 2010

Я довольно плохо знаком с принципами управляемой / неуправляемой совместимости и COM.

Я получил предложение использовать COM Interop для использования моего существующего кода MFC в C #. Но проблема для меня, у меня есть MFC Dll, который не является допустимым компонентом COM. Как я могу сделать так, чтобы эти MFC DLL имели готовые COM-интерфейсы для использования в .NET?

Ответы [ 4 ]

3 голосов
/ 27 апреля 2010

Из потока Загрузка MFC DLL в C # приложении Windows

Для доступа к нативному коду из C # у вас есть несколько вариантов.

Наиболее прямо, вы можете использовать DllImportAttribute для описания точек входа вашей DLL в терминах C #, чтобы их можно было вызывать через P / Invoke. Они будут выглядеть как статические методы для вашей программы на C #.

Менее напрямую, вы можете создать сборку Managed C ++, которая обернет вашу DLL в один или несколько управляемых объектов. Доступ к управляемой DLL C ++ можно получить из C # через Add Reference (поскольку это управляемая сборка с расширением .dll), а также должен иметь возможность доступа к вашей DLL MFC с помощью #include для включения заголовочного файла DLL MFC.

Третий вариант - превратить вашу dll в объект COM, чтобы ваша программа на C # могла получить к ней доступ таким образом.

1 голос
/ 27 апреля 2010

Нет простого способа сделать MFC Dll COM доступным. Необходимо написать много COM-кода вручную, сделав COM-обертку. Если у вас нет опыта работы с COM, это может быть сложно. Второй вариант из поста Якова Селезнева выглядит менее болезненным. Оболочка C ++ / CLI, внутренне связанная с существующей MFC dll и предоставляющая чистый .NET-интерфейс клиенту C #, выглядит оптимальным решением.

Если MFC Dll экспортирует интерфейс в стиле C (API), а не классы, используйте PInvoke.

0 голосов
/ 27 апреля 2010

Из трех способов вызова нативного кода из управляемого кода (COM Interop, P / Invoke и IJW или C ++ / CLI взаимодействие) COM Interop является самым медленным. И если ваш существующий нативный код не в форме COM-компонента, то он также самый сложный, потому что это будет шаг 1.

Чтобы использовать P / Invoke, вам понадобятся некоторые функции в стиле C (extern C), которые продолжают и вызывают ваш существующий код. Чтобы использовать взаимодействие IJW или C ++ / CLI, вы реализуете класс public ref (в скомпилированном файле / clr) с методами, которые продолжают и вызывают ваш существующий код. Вам решать, что вы находите легче. Когда у вас есть оболочка, из C # вы можете выполнить PInvoke с атрибутом DllImport в объявлении функций, а затем вызывать их как обычно. Чтобы сделать IJW, вы добавляете ссылку на сборку с открытым классом ref и вызываете методы этого класса как обычно.

Моя рекомендация - спросить, хотите ли вы какой-нибудь шаблон Facade, в котором вы ставите некоторую логику перед взаимодействием - если так, идите IJW. Также, если вы хотите контролировать маршалинг, идите IJW. Если нет то иди P / Invoke. Но в любом случае работает.

0 голосов
/ 27 апреля 2010

Исходя из моего опыта, я согласен с @Jacob Seleznev и добавлю, что если ваш интерфейс DLL MFC содержит в основном "простые" параметры и типы возвращаемых данных, использование DLLImportAttribute, скорее всего, будет вашим путем наименьшего сопротивления.

Отличный справочник по маршалингам типов - посмотреть, как это делается с неуправляемым Win32 API. Это можно найти здесь: pinvoke.net

Что я сделал, так это нашел вызов API с подобными типами и посмотрел, как этот вызов настроен на pinvoke.net. Я больше этим не пользуюсь, но это было очень полезно несколько лет назад.

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

...