Архив за месяц: Август 2016

Кто все эти люди?

На форумах MSDN задали вопрос "Поясните, пожалуйста, с примерами, чем junior и middle отличаются от senior?". Ответ на этот вопрос будет или субъективным, или очень формальным. Многие организации идут по второму пути. Вводят что мидла должен соответствовать критериям А, Б; миддл критериям В, Г; а синьор должен еще и Д и Е. За такими формальными штуками в эти организации. Под катом мое субъективное мнение никого ни к чему не обязывающее.



Junior - разработчик с небольшим опытом на применяемой платформе. С хорошим качеством может решать похожие задачи. Задачи с которыми раньше не сталкивался вызывают существенный перерасход по времени и выполняются с низким качеством (здесь могут быть как откровенные баги, так и архитектурные ошибки). Практически никогда не думает об альтернативных возможностях работы кода.
Middle - разработчик с опытом реальной разработки на платформе от года и выше. С хорошим качеством и в приемлемые сроки решает как повторяющиеся так и новые задачи. Архитектурные вещи, как правило, косячит. При написании кода предусматривает альтернативные сценарии (контроль входных данных, обработка ошибок).
Senoir - разработчик с очень хорошим знанием платформы. Может не только решать задачи, но и видит когда их можно не решать, может предложить альтернативные способы реализации лучше удовлетворяющие функциональным или нефункциональным требованиям. Полностью с приемлемым качеством может разрабатывать архитектуру средних и крупных программных систем. В зависимости от того к чему лежит душа в дальнейшем или все больше занимается архитектурными вещами и переходит в архитекторы, или больше занимается проработкой требований, обучением коллег и переходит в тимлиды.

Плитка под дерево и 4 преимущества её покупки на нашем сайте keramland.com.ua:

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

Что же делать, если вы любите структуру и сам вид древесины?  Мы предлагаем вам купить востребованный на нашем вебсайте товар, такой как плитка под дерево. Этот продукт имеет схожий вид со структурой настоящего дерева, по внешнему виду вы не сможете отличить его, пока не пройдетесь по кафелю.

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

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

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

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

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

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

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

Плитка под дерево и 4 преимущества её покупки на нашем сайте keramland.com.ua:

1) Часто обновляемый ассортимент и большой выбор керамической продукции;

2) Гарантия на приобретенный товар;

3) Надёжный, долговечный материал;

4) Доставка товара в любой регион Украины.

Контекстная реклама от reklama-up.com.ua и 4 основные её преимущества

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

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

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

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

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

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

Контекстная реклама от reklama-up.com.ua – это самый доступный, эффективный метод раскрутки. Такая реклама начинает приносить плоды уже через несколько дней. На вашем сайте будет заметное увеличение посетителей, и возрастут продажи.

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

Она появляется в то время, когда пользователь заходит на тематический сайт или водит запрос в поисковой системе. Такой баннер не будет раздражать клиента.

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

4 преимущества контекстной рекламы:

1) Можно запустить контекстную рекламу сразу на 2-х популярных поисковиках;

2) Позволяет применять различные виды таргетинга;

3) Показывает объявления только заинтересованным пользователям;

4) Возможность редактирования и выбор позиции показа.

У нас на сайте вам ждет опытные специалисты, которые готовы в любой момент приступить к выполнению вашего заказа.

Три причины воспользоваться интернет-магазином детской одежды «Babyline» на сайте babyline.com.ua

Забота и безмерная любовь родителей к своим детям проявляется через множество действий с их стороны. Правильное питание и обеспечение всеми необходимыми приспособлениями, аксессуарами и игрушками.

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

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

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

Интернет магазин детской одежды «Babyline» на его сайт babyline.com.ua помогут вам в решении многих проблем!

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

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

А при изготовлении демисезонных и зимних курток и пальто используется плащевая или мембранная ткань. Разнообразное цветовое решение материалов позволяет создавать стильные современные яркие модели для маленьких модников и модниц, которые прекрасно подчеркнут изысканный стиль и дизайн.

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

Кроме того, у вас есть несколько причин для выбора именно babyline.com.ua:

  1. Прекрасное сочетание самых высоких показателей качества товара с весьма доступной стоимостью изделий от производителя.

  2. Универсальные способы оплаты за сформированный заказ и его оперативная доставка с помощью курьерской службы «Новая почта».

  3. Удобный классификатор сайта позволяет легко и быстро определиться с выбором необходимых детских вещей.

Пять фактов для того, чтобы купить женское зимнее кашемировое пальто на www.x-style.ua

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

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

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

Среди многих производственных и торговых площадок стоит особо выделить интернет магазин «X-STYLE», который уже много лет радует своих покупателей эксклюзивной продукцией, такой как обувь и белье, женские блузы и аксессуары, оригинальная верхняя одежда.

Купить женское зимнее кашемировое пальто на www.x-style.ua – это ваш верный шаг к успеху!

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

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

Этот натуральный материал прекрасно сочетается с различными отделками из меха и кожи, а также металлической фурнитурой, что позволяет варьировать с различными вариантами моделирования.

У вас есть несколько фактов для того, чтобы приобрести пальто в магазине «X-STYLE», а именно:

  1. Все товары, представленные вниманию покупателей, имеют высокие показатели качества в сочетании с доступной ценой от производителя.

  2. Каждый заказ тщательно обрабатывается специалистами, тщательно подбирая изделие по индивидуальным меркам заказчицы, что позволяет вещи идеально сидеть на фигуре.

  3. Удобный в использовании классификатор товаров имеет красочное изображение каждой позиции и описание основных характеристик.

  4. Любой покупатель выбирает для себя приемлемый способ оплаты. Это может быть банковская карта или наложенный платеж, а также расчет наличными средствами при доставке заказа курьером.

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

Источник: http://www.x-style.ua/

Мнение о книге "Не работайте с м*даками"

В отпуск взял с собой книжку Роберта Саттона. Ну что можно сказать, книга хуже чем название. Нет, в целом тема раскрыта. Кто такие м*даки? Почему с ними лучше не работать? Как действовать, если вы не хотите работать с м*дуками? Как понять а не вы ли он самый? Как выжить если они вокруг? Чем могут быть полезны эти самые м*даки? На все эти вопросы в книге есть ответы. Вот только поработав на нескольких работах, может быть, без подтверждения научными исследованиями, но большинство понимает, что с м*даками работать не надо.
Полезна ли книга? Сложно сказать. Если вы уже придерживаетесь этого правила, то нет. Под придерживаетесь я понимаю не "декларируете это правило", а действительно планомерно притворяете его в жизнь. Если м*даки в руководстве, то ищите другую работу; если м*даки в подчиненных, то расстаетесь с ними; если м*даком оказываешься ты сам, то просишь прощения и проанализировав свой поступок так больше не поступаешь.
Во всех остальных случаях, почему бы и нет. Ведь когда ты уже прожил кейс, то читать про него в книге не очень интересно. А вот если ты, например, попал в ситуацию, когда шеф на тебя орет, доводит придирками и выхода ты не видишь, то сборник готовых рецептов будет неплох. Само собой, надо его применять на себя, на ситуацию, но пища для размышления будет.

Мнение о книге "Не работайте с м*даками"

В отпуск взял с собой книжку Роберта Саттона. Ну что можно сказать, книга хуже чем название. Нет, в целом тема раскрыта. Кто такие м*даки? Почему с ними лучше не работать? Как действовать, если вы не хотите работать с м*дуками? Как понять а не вы ли он самый? Как выжить если они вокруг? Чем могут быть полезны эти самые м*даки? На все эти вопросы в книге есть ответы. Вот только поработав на нескольких работах, может быть, без подтверждения научными исследованиями, но большинство понимает, что с м*даками работать не надо.
Полезна ли книга? Сложно сказать. Если вы уже придерживаетесь этого правила, то нет. Под придерживаетесь я понимаю не "декларируете это правило", а действительно планомерно притворяете его в жизнь. Если м*даки в руководстве, то ищите другую работу; если м*даки в подчиненных, то расстаетесь с ними; если м*даком оказываешься ты сам, то просишь прощения и проанализировав свой поступок так больше не поступаешь.
Во всех остальных случаях, почему бы и нет. Ведь когда ты уже прожил кейс, то читать про него в книге не очень интересно. А вот если ты, например, попал в ситуацию, когда шеф на тебя орет, доводит придирками и выхода ты не видишь, то сборник готовых рецептов будет неплох. Само собой, надо его применять на себя, на ситуацию, но пища для размышления будет.

Камуфляж в интерьере

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

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

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

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

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

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

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

Это могут быть оленьи рога, шкуры медведя, пистолеты и ружья.

Особенности недорогого хостинга и правила его оценки

Более-менее опытные администраторы сайтов знают, что недорогой хостинг редко имеет высокое качество обслуживания. Владельцы таких недорогих серверов экономят на аппаратном и программном обеспечении, а также загружают на один компьютер слишком много клиентских сайтов. Всё это замедляет два важнейших параметра хостинга — скорость загрузки страниц и процент времени, когда сайты доступны в интернете (Аптайм). Но, вполне можно найти качественный недорогой хостинг, если проводить грамотную оценку на этапе предварительного отбора.

  • Для каких целей подойдёт недорогой хостинг?
  • Для создания и ведения блога.
  • Для персонального или семейного сайта.
  • Для небольшого ресурса с информационным контентом.
  • Для Лэндинг пэйдж (одностраничника).
  • Для сайта-визитки, представляющего компанию в интернете.
  • Для портфолио и др.

Какие признаки имеет нормальный недорогой хостинг?

На первом этапе поиска нужно заранее выделить надежный недорогой хостинг из числа заведомо недобросовестных компаний. Сделать это можно по нескольким признакам. Самый важный — процент рабочего времени, который можно определить по счётчику с названием Uptime. Если сервер часто перезагружается и находится в недоступном состоянии, его значение будет ниже 95 %. Второй важный параметр — нормальная по скорости загрузка страниц, но проверить это можно только во время тестового периода и отсюда вытекает третий важный аспект — хостер должен предлагать бесплатное тестирование. Если выбранный вариант имеет высокий Аптайм, бесплатный тестовый период и срок работы более двух лет — можно смело заказывать на нём тестирование.

Какие недостатки часто бывают у дешёвых хостингов?

  • Низкая скорость загрузки сайта.
  • Ленивая служба технической поддержки.
  • Сайт часто бывает недоступным из сети.
  • Сервер виснет и медлит от перегрузки.
  • Старое «железо» и ПО не поддерживает некоторые новые штучки.
  • Компания может и вовсе пропасть, причём совершенно неожиданно.
  • Нет возможностей для «карьерного роста» сайта.
  • Плохая защита от хакеров.

Стоит ли брать недорогой хостинг?

Если Вы планируете создать один из типов сайтов, представленных в списке вначале, то недорогой хостинг сайтов — именно то, что Вам нужно. Примените в поиске три несложных правила, указанных Выше, и можете спокойно тестировать приглянувшийся вариант. Единственное, ни в коем случае не стоит поддаваться искушению взять самый недорогой хостинг — лучше всё-таки выбирать средний вариант. В «самых дешёвых предложениях всегда есть «подводный камень».

Работа с реестром в операционных системах Windows (часть 2)

Когда-то здесь я выкладывал инструменты по работе с реестром для .NET 3.5 SP1. Обнаружилось, что начиная с .NET 4.0 сигнатура нужных для обозначенного кода конструкторов класса RegistryKey была изменена. Как следствие - если наша сборка, скомпилированная под .NET 3.5 SP1 в дальнейшем окажется загруженной в .NET 4.0 (или любую более новую), то мы будем получать исключение времени выполнения при вызове некоторых методов опубликованного кода.


Я внёс некоторые правки в исходный код класса RegistryExtensions и написал несколько интеграционных тестов, проверяющих корректность работы кода в различных ситуациях (в т.ч. избавился от всех директив препроцессора - теперь они не нужны). Проверял в .NET 3.5 SP1, 4.0 и 4.6.1 для платформ x86|x64|AnyCPU:


Обозначенный код я поддерживаю в виду того, что у меня имеется в наработке некоторый объем кода, компилируемого под .NET 3.5 SP1 (т.к. AutoCAD 2009 не поддерживает более новые версии .Net Framework). Этот код должен без проблем компилироваться и успешно работать  не только в .NET 3.5 SP1, но и во всех более новых версиях .NET. Кроме того, необходимо, чтобы ранее скомпилированные мною под .NET 3.5 SP1 сборки успешно загружались и работали в .NET 4.0 - 4.6.1.

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

======================================================================
/* AcProducts
 * RegistryExtensions.cs
 * © Андрей Бушман, 2014
 *
 * В файле RegistryExtensions.cs определён дополнительный
 * функционал, расширяющий возможности работы с реестром из
 * .NET приложений, написанных на .NET 3.5 SP1.
 *
 * ИЗМЕНЕНИЯ:
 * 10-авг-2016
 *      В код внесены правки для того, чтобы он мог
 *      использоваться не только в .NET 3.5 SP1, но и во всех
 *      более новых версиях .NET Framework: например, когда
 *      сборка, скомпилированная под .NET 3.5 SP1 загружается в
 *      код .Net 4.6.1. Код не зависит от разрядности (x86|x64|
 *      AnyCPU).
 */
using System;
using Microsoft.Win32;
using System.Reflection;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;

namespace Bushman.AcProducts {

    /// <summary>
    /// Данный класс предназначен для предоставления 32-битным
    /// приложениям доступа к 64-битным разделам реестра. Класс
    /// так же может использоваться для предоставления
    /// 64-битным приложениям ветке реестра, предназначенной
    /// для 32-битных. За основу взят код, опубликованный в
    /// блоге http://clck.ru/96A9U
    /// </summary>

    public static class RegistryExtensions {

        /// <summary>
        /// Открытие ключа реестра, с указанием того, какую
        /// именно часть следует открывать: записи для
        /// 32-битных приложений, или же записи для 64-битных.
        ///
        /// ВНИМАНИЕ
        /// У данного метода имеется побочный эффект: свойство
        /// `Name` у возвращаемого объекта `RegistryKey` даёт
        /// пустую строку. Однако это не страшно, т.к. имя нам
        /// известно - первую часть можно получить из родителя,
        /// а вторую часть этого имени мы и так знаем,
        /// поскольку передаём её в виде параметра.
        /// </summary>
        /// <param name="parentKey">Родительский элемент
        /// RegistryKey, в котором следует выполнить открытие
        /// подраздера.</param>
        /// <param name="subKeyName">Name of the key to be
        /// opened</param>
        /// <param name="writable">true - открывать для чтения
        /// и записи; false - открывать только для чтения.
        /// </param>
        /// <param name="options">Какую именно часть реестра
        /// следует открывать: относящуюся к 32-битным
        /// приложениям или же относящуюся к 64-битным.
        /// </param>
        /// <returns>Возвращается RegistryKey или null, если по
        /// каким-либо причинам получить RegistryKey не
        /// удалось.</returns>
        public static RegistryKey OpenSubKey(this RegistryKey
            parentKey, String subKeyName, Boolean writable,
            RegWow64Options options) {

            // Проверка работоспособности
            if (parentKey == null || GetPtr(
                parentKey) == IntPtr.Zero) {

                return null;
            }

            // Назначение прав
            Int32 rights = (Int32) (writable ? RegistryRights
                .WriteKey : RegistryRights.ReadKey);

            // Вызов функций неуправляемого кода
            Int32 subKeyHandle, result = RegOpenKeyEx(
                GetPtr(parentKey), subKeyName, 0,
                rights | (Int32) options, out subKeyHandle);

            // Если мы ошиблись - возвращаем null
            if (result != 0) {

                return null;
            }

            /* Получаем ключ, представленный указателем,
             * возвращённым из RegOpenKeyEx */
            RegistryKey subKey = PtrToRegistryKey((IntPtr)
                subKeyHandle, writable, false, options);

            return subKey;
        }

        /// <summary>
        /// Получить указатель на ключ реестра.
        /// </summary>
        /// <param name="registryKey">Ключ реестра, указатель
        /// на который нужно получить.
        /// </param>
        /// <returns>Возвращается объект IntPtr. Если не
        /// удалось получить указатель на обозначенный объект
        /// RegistryKey, то возвращается IntPtr.Zero.</returns>
        public static IntPtr GetPtr(this RegistryKey
            registryKey) {

            if (registryKey == null)
                return IntPtr.Zero;

            /* The `RegistryKey.Handle` property appears since
             * .Net 4.0, therefore for .Net 3.5 I get it
             * through reflection. */
            Type registryKeyType = typeof(RegistryKey);

            FieldInfo fieldInfo = registryKeyType.GetField(
                "hkey", BindingFlags.NonPublic | BindingFlags
                .Instance);

            SafeHandle handle = (SafeHandle) fieldInfo.GetValue
                (registryKey);

            IntPtr unsafeHandle = handle.DangerousGetHandle(
                );

            return unsafeHandle;
        }

        /// <summary>
        /// Получить ключ реестра на основе его указателя.
        /// </summary>
        /// <param name="hKey">Указатель на ключ реестра
        /// </param>
        /// <param name="writable">true - открыть для записи;
        /// false - для чтения.</param>
        /// <param name="ownsHandle">Владеем ли мы
        /// дескриптором: true - да, false - нет.</param>
        /// <returns>Возвращается объект RegistryKey,
        /// соответствующий полученному указателю.</returns>
        public static RegistryKey PtrToRegistryKey(IntPtr
            hKey, Boolean writable, Boolean ownsHandle,
            RegWow64Options opt) {

            if (IntPtr.Zero == hKey) {
                return null;
            }

            Type safeRegistryHandleType =
                typeof(SafeHandleZeroOrMinusOneIsInvalid)
                .Assembly.GetType("Microsoft.Win32." +
                "SafeHandles.SafeRegistryHandle");

            /* Получаем массив типов, соответствующих
             * аргументом конструктора, который нам нужен. */
            Type[] argTypes = new Type[] { typeof(IntPtr),
                typeof(Boolean) };

            BindingFlags flags = default(BindingFlags);

            if (Environment.Version.Major < 4) {
                flags = BindingFlags.Instance | BindingFlags
                    .NonPublic;
            }
            else {
                flags = BindingFlags.Instance | BindingFlags
                    .Public;
            }

            // Получаем ConstructorInfo для нашего объекта
            ConstructorInfo safeRegistryHandleCtorInfo =
                safeRegistryHandleType.GetConstructor(flags,
                    null, argTypes, null);

            /* Вызываем конструктор для SafeRegistryHandle.
             * Класс SafeRegistryHandle появился начиная с .NET
             * 4.0. */
            Object safeHandle = safeRegistryHandleCtorInfo
                .Invoke(new Object[] { hKey, ownsHandle });

            Type registryKeyType = typeof(RegistryKey);
            Type registryViewType = null;

            /*Получаем массив типов, соответствующих аргументом
             * конструктора, который нам нужен */
            Type[] registryKeyConstructorTypes = null;

            if (Environment.Version.Major < 4) {
                registryKeyConstructorTypes = new Type[] {
                safeRegistryHandleType, typeof(bool) };
            }
            else {
                registryViewType = typeof(
                    SafeHandleZeroOrMinusOneIsInvalid).Assembly
                    .GetType("Microsoft.Win32.RegistryView");

                registryKeyConstructorTypes = new Type[] {
                    safeRegistryHandleType, typeof(bool),
                    registryViewType };

                flags = BindingFlags.Instance | BindingFlags
                    .NonPublic;
            }

            // Получаем ConstructorInfo для нашего объекта
            ConstructorInfo registryKeyCtorInfo =
                registryKeyType.GetConstructor(flags, null,
                registryKeyConstructorTypes, null);

            RegistryKey resultKey = null;

            if (Environment.Version.Major < 4) {
                // Вызываем конструктор для RegistryKey
                resultKey = (RegistryKey) registryKeyCtorInfo
                    .Invoke(new Object[] {
                    safeHandle, writable });
            }
            else {
                // Вызываем конструктор для RegistryKey
                resultKey = (RegistryKey) registryKeyCtorInfo
                    .Invoke(new Object[] {
                    safeHandle, writable, (int) opt});
            }

            // возвращаем полученный ключ реестра
            return resultKey;
        }

        /// <summary>
        /// Получение числового значения указателя на искомый
        /// подраздел реестра.
        /// </summary>
        /// <param name="hKey">Указатель на родительский раздел
        /// реестра.</param>
        /// <param name="subKey">Имя искомого подраздела.
        /// </param>
        /// <param name="ulOptions">Этот параметр
        /// зарезервирован и всегда должен быть равным 0.
        /// </param>
        /// <param name="samDesired">Права доступа (чтение\
        /// запись) и указание того, как именно следует
        /// открывать реестр. Значение этого параметра
        /// формируется путём применения операции логического
        /// "И" для объектов перечислений RegistryRights и
        /// RegWow64Options.</param>
        /// <param name="phkResult">Ссылка на переменную, в
        /// которую следует сохранить полученное числовое
        /// значение указателя на искомый подраздел.</param>
        /// <returns>В случае успеха возвращается 0.</returns>
        [DllImport("advapi32.dll", CharSet = CharSet.Auto)]
        static extern Int32 RegOpenKeyEx(IntPtr hKey,
            String subKey, Int32 ulOptions, Int32 samDesired,
            out Int32 phkResult);
    }

    /// <summary>
    /// Перечисление указывает, какую именно часть реестра
    /// следует открывать: относящуюся к 32-битным приложениям
    /// или же относящуюся к 64-битным.
    /// </summary>
    public enum RegWow64Options {

        /// <summary>
        /// Открывать ту часть реестра, которая хранит
        /// информацию приложений, разрядность которых
        /// соответствует разрядности текущего приложения
        /// (x86\x64).</summary>
        None = 0,
        /// <summary>
        /// Открывать часть реестра, относящуюся к 64-битным
        /// приложениям.
        /// </summary>
        KEY_WOW64_64KEY = 0x0100,
        /// <summary>
        /// Открывать часть реестра, относящуюся к 32-битным
        /// приложениям.
        /// </summary>
        KEY_WOW64_32KEY = 0x0200
    }

    /// <summary>
    /// Перечисление, указывающее на то, с каким уровнем
    /// доступа следует открывать ветку реестра: для чтения,
    /// или же для чтения\записи.
    /// </summary>
    public enum RegistryRights {

        /// <summary>
        /// Открыть только для чтения.
        /// </summary>
        ReadKey = 131097,
        /// <summary>
        /// Открыть для чтения и записи.
        /// </summary>
        WriteKey = 131078
    }
}
==================================================================

Интеграционные тесты:

==================================================================
/* AcProducts.IntegrationTests
 * RegistryExtensionsTests.cs
 * © Andrey Bushman, 2016
 *
 * Integration tests of Bushman.AcProducts.RegistryExtensions
 * class.
 */
using System;
using Microsoft.Win32;
using NUnit.Framework;

namespace Bushman.AcProducts.IntegrationTests {

    [TestFixture]
    public class RegistryExtensionsTests {

        [Test]
        public void GetPtr_Returns_ValidPtr() {

            // `Registry.LocalMachine` key always exists.
            RegistryKey rk = Registry.LocalMachine;
            IntPtr rkPtr = rk.Handle.DangerousGetHandle();

            /* The `RegistryKey.Handle` property appears since
             * .Net 4.0, therefore for .Net 3.5 in the code
             * under test I get it through reflection. */
            IntPtr rkPtr2 = RegistryExtensions.GetPtr(rk);

            Assert.AreEqual(rkPtr, rkPtr2);
        }

        [Test]
        public void GetPtr_ReturnsZero_ForNull() {

            /* The `RegistryKey.Handle` property appears since
             * .Net 4.0, therefore for .Net 3.5 in the code
             * under test I get it through reflection. */
            IntPtr ptr = RegistryExtensions.GetPtr(null);

            Assert.AreEqual(IntPtr.Zero, ptr);
        }

        [TestCase(@"SOFTWARE\7-Zip", RegWow64Options
            .KEY_WOW64_64KEY, false)]

        [TestCase(@"SOFTWARE\7-Zip", RegWow64Options
            .KEY_WOW64_32KEY, true)]

        [TestCase(@"SOFTWARE\Notepad++",
            RegWow64Options.KEY_WOW64_64KEY, true)]

        [TestCase(@"SOFTWARE\Notepad++",
            RegWow64Options.KEY_WOW64_32KEY, false)]

        [Description("7-Zip and Notepad++ are to be installed"
            )]
        public void OpenSubKey_ReturnsValidValue(string subkey,
            RegWow64Options opt, bool isNull) {

            RegistryKey rk = Registry.LocalMachine;

            RegistryKey rk2 = RegistryExtensions.OpenSubKey(rk,
                subkey, false, opt);

            if (isNull) {
                Assert.IsNull(rk2);
            }
            else {
                Assert.IsNotNull(rk2);
            }
        }

        [Test]
        public void OpenSubKey_ReturnsNull_ForInvalidSubkey() {

            string subkey =
                "{F28A3464-0A5D-48FB-AFF6-B07F058D3EFC}";

            RegistryKey rk = RegistryExtensions.OpenSubKey(
                Registry.LocalMachine, subkey, false,
                RegWow64Options.None);

            Assert.IsNull(rk);
        }

        [Test]
        public void PtrToRegistryKey_Returns_ValidValie() {

            RegistryKey rk = Registry.LocalMachine;
            IntPtr rkPtr = rk.Handle.DangerousGetHandle();

            RegistryKey rk2 = RegistryExtensions
                .PtrToRegistryKey(rkPtr, false, false,
                RegWow64Options.None);
            IntPtr rkPtr2 = rk2.Handle.DangerousGetHandle();

            Assert.AreEqual(rkPtr, rkPtr2);
        }

        [Test]
        public void PtrToRegistryKey_ReturnsNull_ForZero() {

            RegistryKey rk = RegistryExtensions
                .PtrToRegistryKey(IntPtr.Zero, false, false,
                RegWow64Options.None);

            Assert.IsNull(rk);
        }
    }
}
==================================================================