2010-04-27 4 views
2

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

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

ответ

3

От резьбы Loading MFC DLL in C# Windows Application

Чтобы получить доступ к родной код из C# у вас есть несколько вариантов.

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

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

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

1

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

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

+0

Большое спасибо за все предложения !!! Я пытался найти дополнительную информацию об упаковке, решении Pinvoke. У MFC Dll много классов/enums/structs и т. Д. ... Можно ли экспортировать их каким-либо образом. Я обнаружил, что легко экспортировать функцию, но не уверен в этом !!! – Harsha

0

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

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

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

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

0

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

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

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

+0

Что означает IJW? – User

+1

IJW означает It Just Works. Правильное имя для него - это сочетание C++/CLI. Но это interlude-include-the-header-link-to-the-lib и не похож на interop, он просто чувствует, как работает C++. –

Смежные вопросы