Как я могу вызвать .NET-форму из приложения MFC? - PullRequest
2 голосов
/ 03 апреля 2009

У нас есть несколько больших приложений MFC, которые в настоящее время вызывают COM-объект, чтобы вызвать сложный диалог. Мы хотели бы интегрировать диалог в приложения - мы не хотим продолжать использовать COM-объект.

Я исследую возможность построения диалога в .NET как отдельного проекта (используя формы Windows, а не WPF) и предоставляю второй проект C ++ / CLI, который вызывает его и который можно вызвать из обычного кода C ++. Эта структура такова, что несколько приложений, которым необходимо включить диалог, могут просто подобрать проекты в своих решениях. (Приложения являются устаревшими приложениями, и их переписывание в широких пределах невозможно, мы медленно перемещаем их в .NET, но это многолетний проект. Преобразование приложений в C ++ / CLI не вариант.)

Я собрал его и протестировал из модельного приложения, но пока не могу заставить его работать в простейших больших приложениях, и, основываясь на некоторых вещах, которые я прочитал, я начинаю сомневаться в том, что это возможно. (См. эту ссылку , особенно. Мне известен этот вопрос Stackoverflow , но, похоже, он не актуален.)

Итак. Это вообще возможно? Любые предложения о том, как поступить?

Ответы [ 4 ]

2 голосов
/ 03 апреля 2009

Инкапсулируйте свои элементы управления Windows Forms в пользовательский элемент управления и внедрите их в свое приложение MFC с помощью DDX_ManagedControl:

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

1 голос
/ 03 апреля 2009

Удалось ли вам получить проект C ++ / CLI для вызова в ваш компонент .NET? Я бы попытался сузить, между каким из двух слоев он не проходит.

Поскольку код C ++ может вызывать компоненты COM, вы можете просто скомпилировать .NET dll с поддержкой COM. Я не делал COM в C ++, хотя сам, поэтому я не могу рассказать вам подробности. Но я сделал много открытых библиотек .NET DLL, и эта сторона довольно проста. Обычно просто пара флажков в свойствах проекта (я думаю, под расширенной кнопкой на вкладке сборки).

0 голосов
/ 26 октября 2010

Я наконец решил эту проблему с помощью очень хорошего специалиста службы поддержки Microsoft. Было две проблемы, одна из которых заключалась в том, что многопоточность библиотеки Boost несовместима с C ++ / CLI в состоянии по умолчанию. Одно из решений состоит в том, чтобы скомпилировать с другим набором флагов и затем статически связать его. Другой - использовать его как динамически связанную DLL, что я и сделал.

Вторая часть решения состоит в том, чтобы установить многопоточность CLR в свойстве связывания для STA, поскольку инициализация OLE завершается неудачно с бесполезным сообщением, если это не так.

0 голосов
/ 03 апреля 2009

Зачем вам посредник? Почему не просто

Native C++ app --> C++/CLI class library

Библиотека C ++ / CLI предоставляет встроенную оболочку для CWinFormsView или CWinFormsDialog.

Но зачем вам устранять COM? Это достаточно быстро, и как только вы освоите интерфейсы, церемония не так уж и плоха.

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