Собственный C++ и C# interop

Таким образом, я проектирую приложение, которое делает обязательно работу C++, но MFC/ATL слишком грязен на мой вкус, таким образом, у меня была эта блестящая идея сделать весь "интеллектуальный" код в собственном C++ и весь симпатичный код UI в C#. Проблемой, тем не менее, является совместимость между двумя из них. Прежде чем я также увлекусь этим, я задавался вопросом, является ли это решенной проблемой, и существует действительно хороший способ сделать это. Обратите внимание, что я не хочу смешивать логику и дисплей в том же модуле, как это дает начало раздражающе высокой связи.

Вот то, что я имею до сих пор:

enter image description here

Поэтому скажите мне, это может быть добито большего успеха?

5
задан mackenir 22 April 2013 в 10:59
поделиться

2 ответа

Самый простой способ справиться с этим - использовать C ++ / CLI и подвергать вашу логику в виде типов .NET.

Очень легко обернуть нативный класс C ++ в классе , который используется непосредственно от пользовательского интерфейса C #.

Это было сказано - это был мой план, изначально в моем текущем проекте. Мое мышление было то, что мне нужен родной код для некоторых тяжелых математических работ, которые мы обычно делаем. Однако я нашел, что было проще, быстрее, и приятнее просто просто переместить большую часть моей логики непосредственно в C # (отделенный от кода UI, но все еще в сборке C #), а не попробуйте реализовать его в C ++.

Мой опыт был тот, что скорость не была проблемой - небезопасный код C # почти всегда удалось быть так же быстрее или быстрее, чем у Diquivelent C ++, при настройке, и легче профилировать и настроить код C #.

11
ответ дан 13 December 2019 в 05:36
поделиться

Возможно, у вас есть веские причины для того, чтобы ваше ядро было DLL. Но в этом нет необходимости. Я успешно работал с приложением, которое является C++, оно создает App Domain и загружает в него сборку, затем инстанцирует объект в программном домене и вызывает его, передавая ему интерфейс приложения. По сути, это то, что делает C-версия, когда вы делаете неуправляемое приложение в любом случае.

Интерфейс, который C++ код открывает для C# кода, определен в C#. Я думаю, что это проще, чем определять целые числа в чистом COM. Интерфейс на C# дает вам больше контроля над сортировкой, чем на C++.

  • Создайте файл app_interface.cs, который определяет интерфейс
  • скомпилируйте app_interface.cs в dll, нам плевать на dll. нам нужна библиотека типов.
  • в C++ коде #импорт raw_interfaces_only превращает typelib в C++ .h файл с определениями интерфейсов: app_interface.tlh
  • Реализуйте interface

Вы можете разбрызгивать ваш app_interface.cs атрибутами, которые управляют сортировкой как эта

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("ffffffff-ffff-ffff-ffff-ffffffffffff")] // guid changed from what I really use 
public interface IMyHostApplication
{
   ...

   void   AddErrorDetails (
      [MarshalAs(UnmanagedType.Error)] uint hr, 
      [MarshalAs(UnmanagedType.LPWStr)] string  szErrDetails);

   ...
}
1
ответ дан 13 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: