Владислав Шаклеин. Смешивание управляемого и...

28
примеры практического использования

Transcript of Владислав Шаклеин. Смешивание управляемого и...

Page 1: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

примеры практического использования

Page 2: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Причины, подтолкнувшие к поиску решения и основные методы для смешивания кода

Page 3: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Первопричина исследованияМногие вещи легко делаются с

использованием .NETОднако, старые большие проекты проще

оставить на С++ и не пытаться переделывать ради простоты пары функций

Но COM взаимодействие – это просто слёзы, так как же этими функциями воспользоваться?

Page 4: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Хороший пример от MicrosoftMSDN содержит целых два примера по

вызову форм и элементов форм Winforms из MFC

https://msdn.microsoft.com/ru-ru/library/ahdd1h97.aspx

#pragma managed#pragma unmanaged#pragma managed([push,] on | off)#pragma managed(pop)

Page 5: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Ключевые моменты примеров

Page 6: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Однако, получаем трудность

Page 7: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Что имеемНикакой защиты, код легко вскрываетсяCLR код не поддерживает множественного

наследования

Однако, приложенный в MSDN пример не имеет подобных проблем!

В тексте, поясняющем технологию, об этом ни слова

Но детальный анализ исходного кода выявил причину

Page 8: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Кто ищет, тот всегда найдёт

Page 9: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

В результате, получаем

Page 10: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Просто вызов управляемого кода из машинного (и наоборот)

Page 11: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Вызов Windows Forms из MFCУправляемой или неуправляемой может

быть функция, обрамляем именно еёУправляемые переменные могут

располагаться только в управляемых функциях

Машинные – в любыхВместо new используем gcnewВместо * указатели обозначаем ^

Page 12: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Пример

Page 13: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

РезультатДля старых проектов, новые функции

могут разрабатываться .NET программистами без изменения основного кода

При этом, никто не мешает старой команде продолжать работать в старой среде, так как перескоки из одного вида кода в другой могут происходить многократно

Page 14: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Не все переменные из машинного кода могут свободно существовать в управляемой среде и наоборот

Page 15: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Два правила преобразованияМногие источники посвящают

километровые статьи правилам преобразования, но всё намного проще:

Скалярные переменные преобразуются автоматически

Для остальных добавляем:using namespace System::Runtime::InteropServices;и оттуда используем класс Marshal, наверняка всё нужное там уже есть

Page 16: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

ANSI строки к управляемымSystem::String^ Text =

Marshal::PtrToStringAnsi((System::IntPtr)(void*)txt);

Page 17: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Управляемые к ANSIchar* ptr = (char*)(void*)

Marshal::StringToHGlobalAnsi (subItem->Text);

Marshal::FreeHGlobal ((System::IntPtr)(void*)ptr);

Page 18: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

МассивыВот так описывается управляемый массив

аналог шарпового WORD[] Info:array<WORD>^ Info;

99% авторов преобразуют массивы поэлементноНа самом деле, управляемый массив очень

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

Чтобы отключить работу сборщика мусора для массива, используем:pin_ptr <WORD> pp = &Info[0];m_jtag->SaveParallelFlash (hFile,(WORD*)pp);

Page 19: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Собственно, то, ради чего и задумывались все исследования

Page 20: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Главное – добавить ссылку

Page 21: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Помним, что…Управляемые стековые переменные можно

заводить только в управляемом кодеОбычные – в любом

Page 22: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Наброски примера

Page 23: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Что ещё можно «выжать» из смешивания кода

Page 24: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

.NET плагиныДелаем .NET интерфейс из своей программы

наружуКроме того, добавляем штатную

функциональность поиска плагинов, реализованную в .NET

Получаем возможность расширения функциональности без выдачи исходных текстов сторонним разработчикам

Ну, и возможность расширения функций группами .NET программистов

Page 25: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Нижний уровень .NET приложенийКлассический подход для вызова нижнего

уровня из .NET приложений – разработка DLL

Но можно сделать смешанный код, содержащий переход от одного к другому через #pragma

Примеры: Работа с JTAG адаптером или с жёстикими дисками + .NET класс, обеспечивающий стыковку с обычным .NET кодом

Page 26: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

«Оборачивание» Си-кодаИногда есть старые, но сложные

библиотеки, написанные на С++ или даже Си. Пример – парсер BSDL кода. И программа и структуры данных – сишные. Переписывать – долго

Делаем смешанный код, содержащий .NET прослойку, обеспечивающую вызов старого кода и преобразование данных. Трудозатраты – 1 человеко-день.

Page 27: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического
Page 28: Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического

Смешивание кода:Упрощает вызовы .NET библиотек,

охватывающих широкий набор функцийПозволяет работать над старым

проектом .NET разработчиков (можно – параллельно с разработчиками на классическом С++)

Позволяет добавлять .NET разработчиков без передачи им исходных кодов

Позволяет делать «прозрачный» стык классической реализации «нижнего» и .NET реализации «верхнего» уровней