SlideShare a Scribd company logo
1 of 28
примеры практического использования
Причины, подтолкнувшие к поиску решения и основные
методы для смешивания кода
Первопричина исследования
Многие вещи легко делаются с использованием
.NET
Однако, старые большие проекты проще оставить
на С++ и не пытаться переделывать ради простоты
пары функций
Но COM взаимодействие – это просто слёзы, так
как же этими функциями воспользоваться?
Хороший пример от Microsoft
MSDN содержит целых два примера по вызову
форм и элементов форм Winforms из MFC
https://msdn.microsoft.com/ru-ru/library/ahdd1h97.aspx
#pragma managed
#pragma unmanaged
#pragma managed([push,] on | off)
#pragma managed(pop)
Ключевые моменты примеров
Однако, получаем трудность
Что имеем
Никакой защиты, код легко вскрывается
CLR код не поддерживает множественного
наследования
Однако, приложенный в MSDN пример не имеет
подобных проблем!
В тексте, поясняющем технологию, об этом ни
слова
Но детальный анализ исходного кода выявил
причину
Кто ищет, тот всегда найдёт
В результате, получаем
Просто вызов управляемого кода из машинного (и
наоборот)
Вызов Windows Forms из MFC
Управляемой или неуправляемой может быть
функция, обрамляем именно её
Управляемые переменные могут располагаться
только в управляемых функциях
Машинные – в любых
Вместо new используем gcnew
Вместо * указатели обозначаем ^
Пример
Результат
Для старых проектов, новые функции могут
разрабатываться .NET программистами без
изменения основного кода
При этом, никто не мешает старой команде
продолжать работать в старой среде, так как
перескоки из одного вида кода в другой могут
происходить многократно
Не все переменные из машинного кода могут свободно
существовать в управляемой среде и наоборот
Два правила преобразования
Многие источники посвящают километровые
статьи правилам преобразования, но всё намного
проще:
Скалярные переменные преобразуются
автоматически
Для остальных добавляем:
using namespace System::Runtime::InteropServices;
и оттуда используем класс Marshal, наверняка всё
нужное там уже есть
ANSI строки к управляемым
System::String^ Text =
Marshal::PtrToStringAnsi((System::IntPtr)(void*)txt);
Управляемые к ANSI
char* ptr = (char*)(void*)
Marshal::StringToHGlobalAnsi (subItem->Text);
…
Marshal::FreeHGlobal ((System::IntPtr)(void*)ptr);
Массивы
Вот так описывается управляемый массив аналог
шарпового WORD[] Info:
array<WORD>^ Info;
99% авторов преобразуют массивы поэлементно
На самом деле, управляемый массив очень похож
на обычный, просто у него есть заголовок, плюс
его в любой момент может перенести сборщик
мусора
Чтобы отключить работу сборщика мусора для
массива, используем:
pin_ptr <WORD> pp = &Info[0];
m_jtag->SaveParallelFlash (hFile,(WORD*)pp);
Собственно, то, ради чего и задумывались все
исследования
Главное – добавить ссылку
Помним, что…
Управляемые стековые переменные можно
заводить только в управляемом коде
Обычные – в любом
Наброски примера
Что ещё можно «выжать» из смешивания кода
.NET плагины
Делаем .NET интерфейс из своей программы
наружу
Кроме того, добавляем штатную
функциональность поиска плагинов,
реализованную в .NET
Получаем возможность расширения
функциональности без выдачи исходных текстов
сторонним разработчикам
Ну, и возможность расширения функций
группами .NET программистов
Нижний уровень .NET
приложений
Классический подход для вызова нижнего уровня
из .NET приложений – разработка DLL
Но можно сделать смешанный код, содержащий
переход от одного к другому через #pragma
Примеры: Работа с JTAG адаптером или с
жёстикими дисками + .NET класс,
обеспечивающий стыковку с обычным .NET кодом
«Оборачивание» Си-кода
Иногда есть старые, но сложные библиотеки,
написанные на С++ или даже Си. Пример – парсер
BSDL кода. И программа и структуры данных –
сишные. Переписывать – долго
Делаем смешанный код, содержащий .NET
прослойку, обеспечивающую вызов старого кода и
преобразование данных. Трудозатраты – 1
человеко-день.
Смешивание кода:
Упрощает вызовы .NET библиотек, охватывающих
широкий набор функций
Позволяет работать над старым проектом .NET
разработчиков (можно – параллельно с
разработчиками на классическом С++)
Позволяет добавлять .NET разработчиков без
передачи им исходных кодов
Позволяет делать «прозрачный» стык
классической реализации «нижнего» и .NET
реализации «верхнего» уровней

More Related Content

What's hot

МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5Dima Dzuba
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выраженияTatyanazaxarova
 
А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"
А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"
А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"Anatoly Levenchuk
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...Alexey Paznikov
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Dima Dzuba
 
презентация л.р. №1
презентация л.р. №1презентация л.р. №1
презентация л.р. №1student_kai
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Dima Dzuba
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...Alexey Paznikov
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомTatyanazaxarova
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Dima Dzuba
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 
32 подводных камня OpenMP при программировании на Си++
32 подводных камня OpenMP при программировании на Си++32 подводных камня OpenMP при программировании на Си++
32 подводных камня OpenMP при программировании на Си++Tatyanazaxarova
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейTatyanazaxarova
 
Sequence prediction with TensorFlow
Sequence prediction with TensorFlowSequence prediction with TensorFlow
Sequence prediction with TensorFlowDenis Dus
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli typesmcroitor
 
Типичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.jsТипичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.jsSerge Shirokov
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...Alexey Paznikov
 

What's hot (20)

МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5
 
Lec 15
Lec 15Lec 15
Lec 15
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выражения
 
А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"
А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"
А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 
презентация л.р. №1
презентация л.р. №1презентация л.р. №1
презентация л.р. №1
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8.
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
 
Python: ввод и вывод
Python: ввод и выводPython: ввод и вывод
Python: ввод и вывод
 
PVS-Studio vs Chromium
PVS-Studio vs ChromiumPVS-Studio vs Chromium
PVS-Studio vs Chromium
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментом
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
32 подводных камня OpenMP при программировании на Си++
32 подводных камня OpenMP при программировании на Си++32 подводных камня OpenMP при программировании на Си++
32 подводных камня OpenMP при программировании на Си++
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателей
 
Sequence prediction with TensorFlow
Sequence prediction with TensorFlowSequence prediction with TensorFlow
Sequence prediction with TensorFlow
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli types
 
Типичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.jsТипичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.js
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 

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

Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
 
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.Tatyanazaxarova
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальBadoo Development
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
 
Deep c slides_oct2011_rus
Deep c slides_oct2011_rusDeep c slides_oct2011_rus
Deep c slides_oct2011_rusGarrikus
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозитElena Kotina
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1Michael Karpov
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времениTatyanazaxarova
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5Technopark
 
практические советы по улучшению качества кода
практические советы по улучшению качества кодапрактические советы по улучшению качества кода
практические советы по улучшению качества кодаYuri Afanasiev
 
Большой брат помогает тебе
Большой брат помогает тебеБольшой брат помогает тебе
Большой брат помогает тебеTatyanazaxarova
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.Igor Shkulipa
 
инструменты параллельного программирования
инструменты параллельного программированияинструменты параллельного программирования
инструменты параллельного программированияAlexander Petrov
 
Soft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровняSoft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровняLuxoftTraining
 
массивы Php
массивы Phpмассивы Php
массивы PhpVasya Petrov
 

Similar to Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического использования. (20)

Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
запахи кода
запахи кодазапахи кода
запахи кода
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMerge
 
Deep c slides_oct2011_rus
Deep c slides_oct2011_rusDeep c slides_oct2011_rus
Deep c slides_oct2011_rus
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозит
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времени
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
практические советы по улучшению качества кода
практические советы по улучшению качества кодапрактические советы по улучшению качества кода
практические советы по улучшению качества кода
 
Большой брат помогает тебе
Большой брат помогает тебеБольшой брат помогает тебе
Большой брат помогает тебе
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
 
инструменты параллельного программирования
инструменты параллельного программированияинструменты параллельного программирования
инструменты параллельного программирования
 
Soft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровняSoft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровня
 
массивы Php
массивы Phpмассивы Php
массивы Php
 

More from Platonov Sergey

Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3Platonov Sergey
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.Platonov Sergey
 
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговлеТененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговлеPlatonov Sergey
 
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxПавел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxPlatonov Sergey
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IIДмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IIPlatonov Sergey
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IPlatonov Sergey
 
QML\Qt Quick на практике
QML\Qt Quick на практикеQML\Qt Quick на практике
QML\Qt Quick на практикеPlatonov Sergey
 
Визуализация автомобильных маршрутов
Визуализация автомобильных маршрутовВизуализация автомобильных маршрутов
Визуализация автомобильных маршрутовPlatonov Sergey
 
Функциональный микроскоп: линзы в C++
Функциональный микроскоп: линзы в C++Функциональный микроскоп: линзы в C++
Функциональный микроскоп: линзы в C++Platonov Sergey
 
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Platonov Sergey
 
HPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычисленийHPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычисленийPlatonov Sergey
 
Ranges calendar-novosibirsk-2015-08
Ranges calendar-novosibirsk-2015-08Ranges calendar-novosibirsk-2015-08
Ranges calendar-novosibirsk-2015-08Platonov Sergey
 
Использование maven для сборки больших модульных c++ проектов на примере Odin...
Использование maven для сборки больших модульных c++ проектов на примере Odin...Использование maven для сборки больших модульных c++ проектов на примере Odin...
Использование maven для сборки больших модульных c++ проектов на примере Odin...Platonov Sergey
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияPlatonov Sergey
 
One definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим житьOne definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим житьPlatonov Sergey
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыPlatonov Sergey
 
Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузераPlatonov Sergey
 

More from Platonov Sergey (20)

Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.
 
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговлеТененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
 
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxПавел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IIДмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках II
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
 
QML\Qt Quick на практике
QML\Qt Quick на практикеQML\Qt Quick на практике
QML\Qt Quick на практике
 
Визуализация автомобильных маршрутов
Визуализация автомобильных маршрутовВизуализация автомобильных маршрутов
Визуализация автомобильных маршрутов
 
Функциональный микроскоп: линзы в C++
Функциональный микроскоп: линзы в C++Функциональный микроскоп: линзы в C++
Функциональный микроскоп: линзы в C++
 
C++ exceptions
C++ exceptionsC++ exceptions
C++ exceptions
 
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
 
HPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычисленийHPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычислений
 
Ranges calendar-novosibirsk-2015-08
Ranges calendar-novosibirsk-2015-08Ranges calendar-novosibirsk-2015-08
Ranges calendar-novosibirsk-2015-08
 
Использование maven для сборки больших модульных c++ проектов на примере Odin...
Использование maven для сборки больших модульных c++ проектов на примере Odin...Использование maven для сборки больших модульных c++ проектов на примере Odin...
Использование maven для сборки больших модульных c++ проектов на примере Odin...
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
 
One definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим житьOne definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим жить
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансы
 
Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузера
 

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

  • 2. Причины, подтолкнувшие к поиску решения и основные методы для смешивания кода
  • 3. Первопричина исследования Многие вещи легко делаются с использованием .NET Однако, старые большие проекты проще оставить на С++ и не пытаться переделывать ради простоты пары функций Но COM взаимодействие – это просто слёзы, так как же этими функциями воспользоваться?
  • 4. Хороший пример от Microsoft MSDN содержит целых два примера по вызову форм и элементов форм Winforms из MFC https://msdn.microsoft.com/ru-ru/library/ahdd1h97.aspx #pragma managed #pragma unmanaged #pragma managed([push,] on | off) #pragma managed(pop)
  • 7. Что имеем Никакой защиты, код легко вскрывается CLR код не поддерживает множественного наследования Однако, приложенный в MSDN пример не имеет подобных проблем! В тексте, поясняющем технологию, об этом ни слова Но детальный анализ исходного кода выявил причину
  • 8. Кто ищет, тот всегда найдёт
  • 10. Просто вызов управляемого кода из машинного (и наоборот)
  • 11. Вызов Windows Forms из MFC Управляемой или неуправляемой может быть функция, обрамляем именно её Управляемые переменные могут располагаться только в управляемых функциях Машинные – в любых Вместо new используем gcnew Вместо * указатели обозначаем ^
  • 13. Результат Для старых проектов, новые функции могут разрабатываться .NET программистами без изменения основного кода При этом, никто не мешает старой команде продолжать работать в старой среде, так как перескоки из одного вида кода в другой могут происходить многократно
  • 14. Не все переменные из машинного кода могут свободно существовать в управляемой среде и наоборот
  • 15. Два правила преобразования Многие источники посвящают километровые статьи правилам преобразования, но всё намного проще: Скалярные переменные преобразуются автоматически Для остальных добавляем: using namespace System::Runtime::InteropServices; и оттуда используем класс Marshal, наверняка всё нужное там уже есть
  • 16. ANSI строки к управляемым System::String^ Text = Marshal::PtrToStringAnsi((System::IntPtr)(void*)txt);
  • 17. Управляемые к ANSI char* ptr = (char*)(void*) Marshal::StringToHGlobalAnsi (subItem->Text); … Marshal::FreeHGlobal ((System::IntPtr)(void*)ptr);
  • 18. Массивы Вот так описывается управляемый массив аналог шарпового WORD[] Info: array<WORD>^ Info; 99% авторов преобразуют массивы поэлементно На самом деле, управляемый массив очень похож на обычный, просто у него есть заголовок, плюс его в любой момент может перенести сборщик мусора Чтобы отключить работу сборщика мусора для массива, используем: pin_ptr <WORD> pp = &Info[0]; m_jtag->SaveParallelFlash (hFile,(WORD*)pp);
  • 19. Собственно, то, ради чего и задумывались все исследования
  • 21. Помним, что… Управляемые стековые переменные можно заводить только в управляемом коде Обычные – в любом
  • 23. Что ещё можно «выжать» из смешивания кода
  • 24. .NET плагины Делаем .NET интерфейс из своей программы наружу Кроме того, добавляем штатную функциональность поиска плагинов, реализованную в .NET Получаем возможность расширения функциональности без выдачи исходных текстов сторонним разработчикам Ну, и возможность расширения функций группами .NET программистов
  • 25. Нижний уровень .NET приложений Классический подход для вызова нижнего уровня из .NET приложений – разработка DLL Но можно сделать смешанный код, содержащий переход от одного к другому через #pragma Примеры: Работа с JTAG адаптером или с жёстикими дисками + .NET класс, обеспечивающий стыковку с обычным .NET кодом
  • 26. «Оборачивание» Си-кода Иногда есть старые, но сложные библиотеки, написанные на С++ или даже Си. Пример – парсер BSDL кода. И программа и структуры данных – сишные. Переписывать – долго Делаем смешанный код, содержащий .NET прослойку, обеспечивающую вызов старого кода и преобразование данных. Трудозатраты – 1 человеко-день.
  • 27.
  • 28. Смешивание кода: Упрощает вызовы .NET библиотек, охватывающих широкий набор функций Позволяет работать над старым проектом .NET разработчиков (можно – параллельно с разработчиками на классическом С++) Позволяет добавлять .NET разработчиков без передачи им исходных кодов Позволяет делать «прозрачный» стык классической реализации «нижнего» и .NET реализации «верхнего» уровней