Расширение приложения C ++ Win32 с компонентом C # WPF - PullRequest
2 голосов
/ 17 сентября 2010

Мне нужно добавить новый компонент в приложение C32 Win32 (без поддержки CLR), и я хотел бы реализовать новый компонент в C # и использовать WPF. Этот новый компонент представляет собой окно с некоторыми элементами управления, которые мне нужно быстро запустить из меню в меню приложения Win32. Новый компонент и существующее приложение совместно используют некоторые значения int, и оба могут изменять эти значения, а другой должен уведомляться об изменениях.

Каков наилучший способ добиться этого?

Спасибо

Ответы [ 4 ]

1 голос
/ 17 сентября 2010

Если вы хотите сделать это без изменения вашей компиляции C ++, вы можете посмотреть на вызов сборки .NET как через COM.MSDN описывает, как предоставлять компоненты .NET Framework для COM .

. Я сделал это в основном:

  1. Создание COM-класса и интерфейсав C #
  2. Экспорт TLB из DLL
  3. GAC DLL
  4. Регистрация DLL с помощью regasm.exe
  5. импорт TLB в мойКод C ++

  6. CoCreateInstance с использованием класса __uuidof of my C #

Однако я не не пытался сделать это с компонентом интерфейса пользователя.Если форма WPF представляет собой модальное диалоговое окно, вы должны быть в порядке.Если нет, то я не знаю, будет ли WPF доволен вашей петлей сообщений;вам может понадобиться выделить ему отдельный поток, чтобы он мог запускать свой собственный цикл.

1 голос
/ 17 сентября 2010

Вы видели MSDN документы на эту тему?

Беглое чтение подразумевает, что это невозможно без включения /clr в вашем коде C ++.если вы можете перейти к этой модели, то все, что вы хотите, кажется выполнимым.

Кстати, я бы не реализовывал код обновления / сигнализации по обе стороны управляемой / неуправляемой границы для ваших общих данных.Решите, где хранятся данные, и сделайте так, чтобы этот код предоставлял а) поточно-ориентированные средства доступа и б) проводку «события обновления», которая используется теми, кто должен записывать данные и знать об обновлениях.

Проверьте Шаблон наблюдателя для описания того, как реализовать уведомление для нескольких потребителей.Это может быть излишним для вашего случая, но полезным фоном.

РЕДАКТИРОВАТЬ:

Пока вы не получите два ядра ядра, обсуждение дизайна уведомления о событии кажется преждевременным.Если вы действительно не можете собрать свой собственный код с помощью / clr, тогда я не вижу, как ваш WPF-компонент может использоваться без отдельного процесса, что приводит к сложности взаимодействия и снижению производительности.Можете ли вы повторно реализовать эту функциональность WPF в собственном коде?

С другой стороны - если вы планируете создавать больше модов для этой кодовой базы, возможно, стоит подумать о том, насколько сложно было бы портировать нативный код для / clr-ready.Встроенный ассемблер не препятствует использованию / clr, но усложняет его, так как я уверен, что вы видели здесь .Я предполагаю, что это будет меньше работы, чем внешняя разводка кода WPF.

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

0 голосов
/ 20 сентября 2010

Вместо того, чтобы связываться с COM, я бы предпочел использовать C ++ / CLI в качестве связующего слоя - для этого не требуется перекомпилировать все приложение как C ++ / CLI.

Это означает:

  1. Напишите желаемый код C #.
  2. Напишите тонкую оболочку C ++ / CLI. Это может ссылаться (то есть динамически связывать) на приложение C #. Все, что он делает, это представляет собственный API вокруг .NET API. Это требует некоторого привыкания, но вы можете делать довольно сложные вещи, в том числе довольно причудливое автоматическое взаимодействие через marshal_as. Вы скомпилируете это в dll - DLL в смешанном режиме.
  3. Ваше основное приложение теперь динамически связывается с DLL в смешанном режиме и включает заголовки для его API. Он может вызывать функции как обычно.

Это немного лучше, чем COM, я думаю: он не требует GAC, он имеет меньшую нагрузку, если производительность когда-либо имеет значение, и возможен обмен сложными структурами данных, включая обратные вызовы и графы глубоких объектов (хотя есть Кривая обучения здесь) довольно чисто, добавив пользовательские marshal_as шаблоны / перегрузки.

0 голосов
/ 17 сентября 2010

Один из способов добиться этого - скомпилировать приложение C ++ как приложение C ++ / CLI. Когда это приложение на C ++ / CLI, вы можете легко смешивать управляемый и нативный код и даже легко общаться с управляемыми компонентами.

...