Как стать автором
Обновить

Инкремент в C# изнутри

Время на прочтение 7 мин
Количество просмотров 4.3K
Чулан
Опубликовано по просьбе Rextor'а, у которого отсутствует аккаунт на хабаре.
Написать этот пост меня заставило обсуждение в посте Коварный вопрос по Event \ Delegate()
значения очередности инкремента (что лучше i++ или, ++i ), и имеет ли она принципиальное значение (количество порождаемых объектов и тактов выполнения).
Сразу предупрежу что я пишу именно насчет отдельно стоящих инкрементов, а не аргументов вызова метода.
Конструкция Метод(++i); конечно всегда будет лучше, чем i++; Метод(i);
Поехали
Всего голосов 13: ↑10 и ↓3 +7
Комментарии 2

Борьба с INotifyPropertyChanged или как я стал опенсорсником — 2

Время на прочтение 5 мин
Количество просмотров 32K
.NET *
Начиналось все как и в прошлый раз, достаточно прозаично: мне пришлось разработать *-надцать ViewModel-ей для своего MVVM-приложения.
Для того, чтобы они оптимально работали как ViewModel-и, мои классы должны были наследоваться от DependencyObject или же реализовывать заезженный до дыр интерфейс INotifyPropertyChanged (INPC).

Давно уже ни для кого не секрет, что DependencyProperty тормознее ручной реализации INPC. Мои тесты показывают, что запись в DependencyProperty в ~13 раз медленнее ручной реализации. Поэтому я, как неисправимый оптимизатор, склоняюсь именно к INPC. Тем более, что код поддержки INPC выглядит логичнее и органичнее, чем описание DependencyProperties.

Внимание, дальше много кода и о том, как этот код значительно уменьшить...
Всего голосов 84: ↑69 и ↓15 +54
Комментарии 43

Инъекции MSIL кода в стороннюю сборку при помощи Mono.Cecil. Реализация принципов АОП в NET

Время на прочтение 12 мин
Количество просмотров 18K
.NET *
Из песочницы

Введение


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

Многие .NET разработчики знают, что для доступа к объектам чужой сборки можно использовать Reflection. С помощью типов из System.Reflection мы можем получить доступ ко многим объектам .NET сборки, просмотреть их метаданные, и даже использовать те объекты, доступ к которым ограничен (например, private методы чужого класса). Но использование Reflection имеет свои ограничения и главная причина этому — данные, с котороми вы работаете через Reflection, все еще считаются кодом. Таким образом, вы, к примеру, можете получить CodeAccessSecurity exception, если сборка, к которой вы пытаетесь применить Reflection, запрещает это. По этой же причине Reflection работает довольно медленно. Но наиболее важным для данной статьи является то, что стандартный Reflection не позволяет изменять существующие сборки, только генерировать и сохранять новые.

Mono.Cecil


Качественно иной подход предлагает бесплатная библиотека с открытым исходным кодом Mono.Cecil. Главное отличие подхода Mono.Cecil от подхода Reflection в том, что данная библиотка работает с NET сборкой как с потоком байт. При загрузке сборки, Mono.Cecil разбирает PE заголовок, CLR заголовок, MSIL код классов и методов и т.д. работая напрямую с потоком байтов, представляющим сборку. Таким образом, с помощью данной библиотеки можно как угодно (в пределах предусмотренного) изменять имеющуюся сборку.
Читать дальше →
Всего голосов 49: ↑45 и ↓4 +41
Комментарии 14

Mono.Cecil: делаем свой «компилятор»

Время на прочтение 4 мин
Количество просмотров 12K
.NET *
Одной из самых роскошных тем для программистов, балующихся изобретением велосипедов, является написание собственных языков, интерпретаторов и компиляторов. Действительно, программа, способная создавать или исполнять другие программы, инстинктивно вселяет благоговейный трепет в сердца кодеров — потому что сложно, объемно, но безумно увлекательно.

Большинство начинают с собственных интерпретаторов, которые представляют собой в общем виде огромный свитч команд в цикле. Интересно, вольготно, но муторно и весьма медленно. Хочется чего-то более шустрого, чтобы JIT'ить умело и, желательно, само следило за памятью.

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



Читать дальше →
Всего голосов 48: ↑36 и ↓12 +24
Комментарии 19

Избавление .NET программы от регистрации на примере BEM

Время на прочтение 5 мин
Количество просмотров 4.2K
.NET *
Из песочницы
Не так давно я решил изучить, а заодно попробовать поправить одну библиотечку, избавив программу работающую на данной библиотеке от лицензии.

Началось все с того, что как то мне в руки попала программа для бухгалтерской отчетности, некий бюджетный вариант 1С. Как заверяли разработчики этой программы, что она является, чуть ли не самой защищенной и устойчивой к взломам. Именно это хвастовство и подтолкнуло опровергнуть излишнюю самоуверенность разработчиков.
Читать дальше →
Всего голосов 39: ↑29 и ↓10 +19
Комментарии 8

Снова используем Unmanaged С++ код в .NET программах

Время на прочтение 7 мин
Количество просмотров 4.4K
.NET *
.NET C++

Около года назад я писал статью о том, как можно вызывать методы классов написанных на чистом Си++ из любой .NET программы не прибегая к регистрации COM библиотек, C++/CLI и т.п.

Сегодня я расскажу об еще одном оригинальном и весьма удобном подходе, а, кроме того, этот топик будет интересен всем хаброчитателям которые хотят побольше узнать о замечательном инструменте Reflection.Emit (на мой взгляд эта тема на хабре недостаточно хорошо освещена).

Читать дальше →
Всего голосов 70: ↑61 и ↓9 +52
Комментарии 7

Разрабатываем компилятор для учебного языка Cool на языке C# под .NET (Часть 1)

Время на прочтение 11 мин
Количество просмотров 20K
.NET *Компиляторы *C# *
Из песочницы

Введение


Здравствуй, уважаемый хабраюзер.Я хотел бы тебе представить материал о практическом создании компилятора, который будет транслировать код, написанный на языке Cool, в код виртуальной машины CIL (Common Intermediate Language) под платформу .NET.Данный материал я решил разбить на две части из-за лени все сразу это описывать

В первой части будет описан процесс написания грамматики с учетом приоритетов операторов в среде ANTLR, а также генерации лексера и парсера под язык C#. Также в ней будут рассмотрены подводные камни, которые встретились у меня на пути. Таким образом я постараюсь хоть кому-нибудь сэкономить время (может быть для себя в будущем).

Во второй же части будет описан процесс построения семантического анализатора кода, генерации кода и самопальной никому не нужной оптимизации кода. Также будет описано, как сделать красивый интерфейс с блекджеком и шлюхами с подсветкой синтаксиса и сворачиванием блоков, как в современных IDE. В конце второй части я, конечно же, выложу все исходники моего солюшена и расскажу о дальнейшей улучшении архитектуры и кода, во всяком случае как это представляется мне.

Читать дальше →
Всего голосов 51: ↑46 и ↓5 +41
Комментарии 14

Разрабатываем компилятор для учебного языка Cool на языке C# под .NET (Часть 2 + Бонусы)

Время на прочтение 16 мин
Количество просмотров 11K
.NET *Компиляторы *C# *
Привет, Хабрахабр!

Введение


В данной статье, я, как и обещал, продолжу описание разработки компилятора для языка Cool, начатое в этой статье.

Напомню, что процесс компиляции по фен-шую включает в себя несколько этапов, которые изображены на рисунке ниже слева. Мой же компилятор содержит только три этапа, которые изображены на этом же рисунке справа.

Читать дальше →
Всего голосов 33: ↑27 и ↓6 +21
Комментарии 6

AMD APP SDK: Intermediate Language (IL)

Время на прочтение 8 мин
Количество просмотров 13K
Высокая производительность *GPGPU *
Из песочницы
AMD APP
ATI Stream SDK было переименовано в AMD Accelerated Parallel Processing (APP) SDK, на смену основного языка программирования GPGPU вычислений Brook+ пришел OpenCL. Однако, не многие догадываются, что писать код для ATI-шных карточек можно при помощи другой технологии: AMD Compute Abstraction Layer (CAL) / Intermediate Language (IL). Технология CAL предназначена для написания кода, взаимодействующего с GPU и выполняющегося на CPU, в то время как технология IL позволяет писать код, который будет выполняться непосредственно на GPU.

В данной статье будет рассмотрена технология IL, ее область применения, ограничения, преимущества по сравнению с OpenCL. Кому интересно, прошу под кат.

Follow the white rabbit
Всего голосов 23: ↑23 и ↓0 +23
Комментарии 6

Математические выражения в .NET (разбор, дифференцирование, упрощение, дроби, компиляция)

Время на прочтение 19 мин
Количество просмотров 39K
Open source *.NET *Компиляторы *
Мне со школьных времен был интересен алгоритм вывода аналитических производных и упрощения выражений. Данная задача была актуальна впоследствии и в вузе. Тогда-то я реализовал ее, только получилось все не так, как хотелось: вместо кода IL у меня просто генерировался C# код в текстовом виде, сборки не выгружались, ну и к тому же не было возможности вывода производных в аналитическом виде. Однако потом я решил все-таки реализовать такую библиотеку, так как интерес остался. Стоит отметить, что таких библиотек в интернете большое количество, но нигде я не нашел именно этапа компиляции выражений в IL код, т.е. по сути везде выполняется интерпретация, которая не столь эффективна, в отличие от компиляции. Ну и к тому же я это разрабатывал чисто для себя, для изучения новых технологий, особо не надеясь, что результат моих трудов может где-нибудь потребоваться. Для нетерпеливых: исходники, программа.

Используемые программы и библиотеки


  1. GOLD Parsing System — IDE для написания грамматик и генерации кода лексеров и парсеров под различные языки (C, C#, Java, JavaScript, Objective-C, Perl, Python, Ruby и др.). Основана на LALR парсинге.
  2. Visual Studio 2010
  3. GOLD.Engine — сборка под .NET, подключаемая для взаимодействия со сгенерированными таблицами.
  4. NUnit — Открытая среда юнит-тестирования приложений для .NET.
  5. ILSpy — OpenSource дизассемблер под .NET.

Этапы, на которые я разбил весь процесс:
  1. Построение дерева выражения
  2. Вычисление аналитической производной
  3. Упрощение (симплификация) выражения
  4. Обработка рациональных дробей
  5. Компиляция выражения

Читать дальше →
Всего голосов 80: ↑76 и ↓4 +72
Комментарии 35

Инъекция кода в .NET CLR: изменение IL-кода во время выполнения программы

Время на прочтение 13 мин
Количество просмотров 38K
.NET *Системное программирование *C# *
Перевод

Предисловие



Изменение .NET метода MSIL кода во время выполнения приложения – это очень круто. Это настолько круто, что можно перехватывать вызовы функций (hooking), сделать защиту своего ПО и другие удивительные вещи. Именно поэтому мне уже давно хотелось это осуществить, но была одна проблема – MSIL код компилируется в машинный код с помощью JIT перед тем, как мы сможем что-либо с этим кодом сделать. А так как .NET CLR не документирована и изменяется от версии к версии, то мы и будем искать стабильный и надёжный путь, независимый от точного расположения адресов в памяти.
Читать дальше →
Всего голосов 92: ↑90 и ↓2 +88
Комментарии 7

Светофор на ПЛК – все языки МЭК 61131-3

Время на прочтение 2 мин
Количество просмотров 45K
Программирование *Промышленное программирование *
В прошлой статье Светофор на ПЛК – 30 блоков программа для ПЛК светофора была написана только на FBD.
Новая программа использует все 5 языков стандарта МЭК 61131-3.
Читать дальше →
Всего голосов 17: ↑17 и ↓0 +17
Комментарии 0

Когда строка не является строкой?

Время на прочтение 6 мин
Количество просмотров 20K
Ненормальное программирование *Программирование *.NET *
Перевод
В рамках моей «работы» над стандартизацией C# 5 в технической группе ECMA-334 TC49-TG2 мне посчастливилось увидеть несколько интересных способов, которыми Владимир Решетников проверял C# на прочность. В данной статье описана одна из проблем, которые он поднял. Разумеется, она, скорее всего, никак не затронет 99.999% C#-разработчиков… но разобраться все равно любопытно.

Спецификации, используемые в статье:


Что такое строка?


Как бы вы объявили тип string (или System.String)? Я могу предположить несколько вариантов ответа на данный вопрос, от расплывчатых до довольно конкретных:

  • «Какой-нибудь текст в кавычках»
  • Последовательность символов
  • Последовательность символов Юникода
  • Последовательность 16-битных символов
  • Последовательность слов UTF-16

Только последнее утверждение полностью верно. Спецификация C# 5 (раздел 1.3) гласит:

Обработка строк и символов в C# использует UTF-16. Тип char представляет слово UTF-16, а тип string – последовательность слов UTF-16.

Пока всё в порядке. Но это C#. А как насчет IL? Что используется там, и имеет ли это значение? Оказывается, что имеет… Строки должны быть объявлены в IL как константы, и природа этого способа представления важна – не только кодировка, но и интерпретация этих закодированных данных. В частности, последовательность слов UTF-16 не всегда может быть представлена в виде последовательности слов UTF-8.
Читать дальше →
Всего голосов 31: ↑29 и ↓2 +27
Комментарии 18

Заполнение текстовых шаблонов данными на основе модели. Реализация на .NET с использованием динамических функций в байт-коде (IL)

Время на прочтение 19 мин
Количество просмотров 9.4K
.NET *C# *
Туториал

Пролог


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

Сразу возник вопрос — как это реализовать? На ум приходили различные решения, начиная от задания в шаблоне неких константных значений, которые бы заменялись на данные модели, и заканчивая полноценными вьюхами Razor (сайт построен на MVC 5).

После непродолжительной битвы с самим собой, я пришел к выводу, что эту достаточно распространенную задачу пора решить раз и навсегда, и что ее решение должно быть не очень сложным (т.е. не должно зависеть от библиотек, не входящих в состав .NET Framework 4), но при этом достаточно функциональным, чтобы решать поставленную задачу и иметь запас по расширяемости.

В данной статье я расскажу о решении на основе генератора байт-кода, которое удовлетворяет этим требованиям, а также прокомментирую наиболее интересные фрагменты кода.

Если вас интересует только шаблонизатор, ссылочки ниже:

Исходные коды шаблонизатора (Genesis.Patternizer) и тестовой консоли в проекте на SourceForge: https://sourceforge.net/projects/open-genesis/?source=navbar
Или в архиве одним файлом: Patternizer.zip

Читать дальше →
Всего голосов 6: ↑5 и ↓1 +4
Комментарии 5

Быстрая и удобная генерация IL

Время на прочтение 14 мин
Количество просмотров 19K
Блог компании Контур .NET *Assembler *C# *
Из песочницы
Я много раз сталкивался с задачей динамической генерации кода (например, при написании эффективного сериализатора или компилятора DSL). Это можно делать разными способами, какой из них лучший – дискуссия для отдельной статьи. По ряду причин я предпочитаю Reflection.Emit и CIL (Common Intermediate Language) и расскажу, с какими проблемами пришлось столкнуться на этом пути, а также об их решении: умной обертке над ILGeneratorGroboIL из библиотеки Graceful Emit.

Хочу отметить при этом, что иногда встречаются ситуации, когда у нас нет большого выбора: например, при написании сериализатора необходимо иметь доступ к приватным полям, и приходится использовать IL. Кстати, известный сериализатор protobuf-net содержит несколько сотен IL-инструкций.

Если вы ни разу не сталкивались с использованием IL-кода, то статья может показаться сложной для понимания, поскольку содержит много примеров кода с использованием IL. Для получения базовых знаний рекомендую прочитать статью Introduction to IL Assembly Language.
Читать дальше →
Всего голосов 28: ↑27 и ↓1 +26
Комментарии 22

Маппинг в C# на примере сериализатора для AMF

Время на прочтение 26 мин
Количество просмотров 19K
Программирование *.NET *Apache Flex *C# *ООП *
Туториал
Из песочницы
Приветствую, друзья. Сегодня речь пойдёт о реализации маппинга на C#, а так же о применении сей реализации в решении реальных задач на примере отправки данных AMF на сервер. Всё нижеизложенное не претендует на какие-либо эталоны реализации алгоритмов и паттернов проектирования кода, это лишь описание одного из множества, далеко не всегда очевидных для новичков, решений.

В процессе изучения статьи, Вы узнаете как реализовать собственные атрибуты и как их применять, познакомитесь с методами расширений типов и применением рефлексии на практике, узнаете об основах MSIL в целом и OpCodes в частности, а так же о том, как можно сериализовать объекты в AMF с помощью потоков.
Читать дальше →
Всего голосов 20: ↑17 и ↓3 +14
Комментарии 6

Как замкнуть переменную в C# и не выстрелить себе в ногу

Время на прочтение 9 мин
Количество просмотров 31K
Блог компании PVS-Studio .NET *Компиляторы *C# *
Еще в далеком 2005 с выходом стандарта C# 2.0 появилась возможность передачи переменной в тело анонимного делегата посредством ее захвата (или замыкания, кому как угодно) из текущего контекста. В 2008 вышел в свет новый стандарт C# 3.0, принеся нам лямбды, пользовательские анонимные классы, LINQ запросы и многое другое. Сейчас на дворе январь 2017 и большинство C# разработчиков с нетерпением ждут релиз стандарта C# 7.0, который должен привнести много новых полезных «фич». А вот фиксить старые «фичи», никто особо не торопится. Поэтому способов случайно выстрелить себе в ногу по-прежнему хватает. Сегодня мы поговорим об одном из их, и связан он с не совсем очевидным механизмом захвата переменных в тело анонимных функций в языке C#.

Picture 1

Читать дальше →
Всего голосов 54: ↑45 и ↓9 +36
Комментарии 43

Unsafe generic math in C#

Время на прочтение 13 мин
Количество просмотров 11K
Ненормальное программирование *.NET *C# *


К сожалению, адекватно перевести название затеянного мной безобразия на русский язык оказалось не просто. С удивлением я обнаружил, что официальная документация MSDN называет "дженерики" "шаблонами" (по аналогии с C++ templates, я полагаю). В попавшемся мне на глаза 4-м издании "CLR via C#" Джеффри Рихтера, переведенном издательством "Питер", дженерики именуются "обобщениями", что гораздо лучше отражает суть понятия. В этой статье речь пойдет о небезопасных обобщенных математических операциях в C#. Учитывая, что C# не предназначен для высокопроизводительных вычислений (хотя, безусловно, на это способен, но не в состоянии тягаться с тем же C/C++), математическим операциям в BCL уделено не так много внимания. Давайте попробуем упростить работу с базовыми арифметическими типами силами C# и CLR.

Добро пожаловать под кат
Всего голосов 13: ↑12 и ↓1 +11
Комментарии 15

Check how you remember nullable value types. Let's peek under the hood

Время на прочтение 10 мин
Количество просмотров 756
Блог компании PVS-Studio .NET *C# *
image1.png

Recently nullable reference types have become trendy. Meanwhile, the good old nullable value types are still here and actively used. How well do you remember the nuances of working with them? Let's jog your memory or test your knowledge by reading this article. Examples of C# and IL code, references to the CLI specification, and CoreCLR code are provided. Let's start with an interesting case.
Read more →
Рейтинг 0
Комментарии 0

Хорошо ли вы помните nullable value types? Заглядываем «под капот»

Время на прочтение 11 мин
Количество просмотров 12K
Блог компании PVS-Studio .NET *C# *
image1.png

В последнее время модной темой стали nullable reference types. Однако старые добрые nullable value types никуда не делись и всё так же активно используются. Хорошо ли вы помните нюансы работы с ними? Предлагаю освежить или проверить свои знания, ознакомившись с этой статьёй. Примеры кода на C# и IL, обращения к спецификации CLI и коду CoreCLR прилагаются. Начать предлагаю с интересной задачки.
Читать дальше →
Всего голосов 45: ↑45 и ↓0 +45
Комментарии 5
1