2009-04-02 2 views
2

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

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

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

So. Возможно ли это? Любые предложения о том, как действовать?

ответ

0

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

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

1

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

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

+0

У нас уже есть компонент COM на основе C++. Целью этого проекта является устранение необходимости в COM. – mlo

+0

Я получаю сбои в инициализации OLE до того, как выполнение когда-либо приближается к рассматриваемому коду. Ошибка Google в том, что ошибка привела меня к первой ссылке. – mlo

0

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

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

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

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

+0

В существующем объекте COM есть много кода на C++, я бы предпочел не переносить .NET. Структура, которую я использую, имеет два сложных диалога в виде отдельных проектов C#, которые вызывается из основной части кода, который является старым кодом на C++.Это вызвано из основного приложения так же, как и сейчас. – mlo

+0

Хорошо, тогда я смущен в вопросе. У вас это работает или нет? –

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