Таким образом, я проектирую приложение, которое делает обязательно работу C++, но MFC/ATL слишком грязен на мой вкус, таким образом, у меня была эта блестящая идея сделать весь "интеллектуальный" код в собственном C++ и весь симпатичный код UI в C#. Проблемой, тем не менее, является совместимость между двумя из них. Прежде чем я также увлекусь этим, я задавался вопросом, является ли это решенной проблемой, и существует действительно хороший способ сделать это. Обратите внимание, что я не хочу смешивать логику и дисплей в том же модуле, как это дает начало раздражающе высокой связи.
Вот то, что я имею до сих пор:
Поэтому скажите мне, это может быть добито большего успеха?
Самый простой способ справиться с этим - использовать C ++ / CLI и подвергать вашу логику в виде типов .NET.
Очень легко обернуть нативный класс C ++ в классе
, который используется непосредственно от пользовательского интерфейса C #.
Это было сказано - это был мой план, изначально в моем текущем проекте. Мое мышление было то, что мне нужен родной код для некоторых тяжелых математических работ, которые мы обычно делаем. Однако я нашел, что было проще, быстрее, и приятнее просто просто переместить большую часть моей логики непосредственно в C # (отделенный от кода UI, но все еще в сборке C #), а не попробуйте реализовать его в C ++.
Мой опыт был тот, что скорость не была проблемой - небезопасный код C # почти всегда удалось быть так же быстрее или быстрее, чем у Diquivelent C ++, при настройке, и легче профилировать и настроить код C #.
Возможно, у вас есть веские причины для того, чтобы ваше ядро было DLL. Но в этом нет необходимости. Я успешно работал с приложением, которое является C++, оно создает App Domain и загружает в него сборку, затем инстанцирует объект в программном домене и вызывает его, передавая ему интерфейс приложения. По сути, это то, что делает C-версия, когда вы делаете неуправляемое приложение в любом случае.
Интерфейс, который C++ код открывает для C# кода, определен в C#. Я думаю, что это проще, чем определять целые числа в чистом COM. Интерфейс на C# дает вам больше контроля над сортировкой, чем на C++.
#импорт raw_interfaces_only
превращает typelib в C++ .h файл с определениями интерфейсов: app_interface.tlhВы можете разбрызгивать ваш 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);
...
}