Як відомо, в .Net Core, на даний момент, немає AppDomain, а WCF тільки SOAP клієнт .Net Core, WCF і ODATA клієнти.

Звичайно, завдання можна вирішити і через Web Api з WebSockets для виклику подій. Але, я просто пропоную альтернативне рішення на маршалинге по TCP/IP і створення об'єктів, і виклик методів на стороні сервера за допомогою Reflection.

Ось як виглядає віддалений виклик методів і властивостей. Приклад взято звідси Основи перевантаження операторів:

// Виведемо повідомлення в консолі сервера
string typeStr = typeof(Console).AssemblyQualifiedName;
var _Console = wrap.GetType(typeStr);// Отримаємо тип на сервері по імені
// "Hello from Client" буде виведено в консолі сервера
_Console.WriteLine("Hello from Client");

// отримаємо тип по імені класу TestDllForCoreClr.MyArr
// Із збірки TestDll.dll
var MyArr = wrap.GetType("TestDllForCoreClr.MyArr", "TestDll");

// Створимо об'єкти на стороні сервера
// і отримаємо посилання на них
var Point1 = MyArr._new(1, 12, -4); // new MyArr(1, 12, -4);
var Point2 = MyArr._new(0, -3, 18); // new MyArr(0, -3, 18);

// Всі операції з об'єктами PointX відбуваються на стороні сервера
Console.WriteLine("Координати першої точки: "+Point1.x+" "+Point1.y+" "+Point1.z);
Console.WriteLine("Координати другої точки: "+Point2.x+" "+Point2.y + " "+ Point2.z);

var Point3 = Point1 + Point2;
Console.WriteLine("\nPoint1 + Point2 = " + Point3.x + " " + Point3.y + " " + Point3.z);
Point3 = Point1 - Point2;
Console.WriteLine("Point1 - Point2 = "+ Point3.x + " " + Point3.y + " " + Point3.z);
Point3 = -Point1;
Console.WriteLine("-Point1 = " + Point3.x + " " + Point3.y + " " + Point3.z);
Point2++;
Console.WriteLine("Point2++ = "+ Point2.x + " " + Point2.y + " " + Point2.z);
Point2--;
Console.WriteLine("Point2-- = " + Point2.x + " " + Point2.y + " " + Point2.z);

Читати далі →

Всім добрий день. Я хочу представити на суд громадськості (ще один) простий спосіб зробити локалізацію додатків. Стандартний механізм з ресурсними збірками мене не влаштовує з наступних причин:
  1. Отримуючи значення локалізованої рядка в коді, дуже хочеться покладатися на всю міць ООП і підказки компілятора. Дуже неприємно зібрати проект ввечері в п'ятницю, а вранці в суботу отримати дзвінок від впахивающих overtime QA на тему того, що хтось неуважний написав GetResource(«asdf») замість GetResource(«assf»), і тепер щось падає або неправильне, а проект в понеділок вже здавати у друк ...
  2. (В продовження попереднього пункту...) Писати string foo = language.Ui.PromtDialog.AdditionalQuestion просто приємніше, ніж string foo = Resources.GetResource(«Ui_PromtDialog_AdditionalQuestion»). Так, в тому числі і за рахунок підказок компілятора.
  3. Іноді локалізувати потрібно не рядки, а цілі об'єкти. Наприклад, іменник (рядок + рід М/Ж/З/Мн) і прикметник (рядок М + рядок Ж + рядок З + рядок Мн). Пхати в ресурси сериализованную рядок, а потім діставати і десериализовать кожен раз? Мсьє знає толк в збоченнях...
  4. Ресурсний файл — це плоский список рядків, а хотілося б, щоб все-таки мали більш складну ієрархічну структуру, за якої не потрібно повзати з допомогою Ctrl+F.
  5. Створення нової мови має бути настільки простим, наскільки це можливо. Локалізувати додаток повинен бути здатний людина, що вміє поводитися з комп'ютером і володіє потрібними мовами. І йому для цього не потрібні ні Visual Studio, ні метушня з створенням ресурсних збірок.
Ще одна обов'язкова вимога — можливість простій прив'язки до локалізації елементів UI. Бажано — одночасно і WPF, і WinForms.

Читати далі →

Ми вже кілька років робимо наш продукт автоматизації маркетингу, і пиляти фічі з високою швидкістю нам допомагає CI, а точніше — велика кількість автоматичних тестів.

У продукті приблизно 700 000 рядків коду з усіма кастомизациями, і на це ми маємо близько 7 000 тестів, і їх кількість постійно зростає. За рахунок них ми не боїмося робити великі рефакторинги, що зачіпають багато частин системи. Але, на жаль, тести не панацея. Якихось тестів може не бути, якісь тести можуть виявитися занадто дорогими, а якісь ситуації не відтворюються в тестовій середовищі.

Практично кожна транзакція в нашій системі пов'язана з роботою з MS SQL з використанням LinqToSql. Так, технологія старенька, але мігрувати з неї нам досить складно, і по бізнесу вона нас цілком влаштовує. Більш того, як я вже писав раніше, у нас навіть є свій форк LinqToSql, де ми трохи чиним його баги і додаємо деякий функціональності.

Для того, щоб робити запити до БД, використовуючи LinqToSql, потрібно використовувати інтерфейс IQueryable. В момент отримання Enumerator'а чи виконання Execute у QueryProvider'а побудоване дерево виразів з допомогою Extension-методів до IQueryable транслюється в SQL, який і виконується на SQL Server.

Так як наша бізнес-логіка сильно зав'язана на сутності в базі даних, наші тести багато працюють з базою даних. Однак у 95% тестів ми не використовуємо реальну базу, так як це дуже дорого за часом, а задовольняємося InMemoryDatabase. Вона є частиною нашої тестової інфраструктури, про яку можна написати окрему статтю, і насправді представляє з себе просто Dictionary<Type, List> для кожного існуючого типу сутності. У тестах наш UnitOfWork прозоро працює з такою базою, даючи доступ до EnumerableQueryable, який просто отримати з будь-якого IEnumerable, викликавши у нього AsQueryable().

Покажу приклад тесту для розуміння того, що відбувається:

Читати далі →

Одним жах яким прохолодним січневим ранком від знайомого прилетів питання — як на C# визначити, не запущена програма в ОС (віконне додаток в ОС Windows 7 або новіше) на віртуальній машині.
Вимоги до такого детектора були досить жорсткими:

  1. Повинен бути повністю у вихідних кодах,
  2. Повинен збиратися за допомогою Visual Studio,

  3. Повинен працювати з-під облікового запису непривілейованого користувача (не можна використовувати методи, що вимагають, наприклад, установки драйверів пристроїв, чи інших операцій, для яких потрібні права адміністратора),
  4. Дозволено використовувати .NET Framework 4.5 і ніяких зайвих залежностей (типу Visual C++ Redistributable Package).

Під катом опис реалізованого детектора на C# (в наступної частини — з деякими елементами C++) і пристойною кількістю непристойного коду з використанням Visual Studio 2015 Community.
Структура публікації
  • 1 рівень. Вивчення матчастини і найпростіших існуючих рішень:

    • трохи теорії щодо віртуалізації,
    • реалізація перевірки ВМ з допомогою даних з Windows Management Instrumentation (WMI).


  • 2 рівень. Пошук статей і публікацій про детектування запуску у віртуальних машинах:

    • допиливаем реалізацію з WMI,
    • робота з інструкцією CPUID.


  • 3 рівень. Пошук матеріалів з хакерських конференцій:

    • допиливаем роботу з CPUID,
    • робимо зведену таблицю параметрів і результатів тестування.


Читати далі →

Події і потоки. Частина 1

Відразу скажу, що стаття не про потоки, а про події в контексті потоків .NET. Тому я не буду намагатися організувати роботу потоків правильно (з усіма блокуваннями, колбэками, скасуванням і тд). Для правильної організації потоків є інші статті.

Всі приклади будуть написані на мові C# для версії фреймворку 4.0 (на 4.6 все трохи простіше, але все ще є багато проектів на 4.0). Так само буду намагатися дотримуватися версії C# 5.0.

Читати далі →

Фреймворк NancyFX і сервіси в стилі REST

Доброго дня, пані та панове. Подумалося, в нашій п'ятничної рубриці ще не було жодної слушною статті про надувних динозаврів в контексті готельного бізнесу.

Якщо раптом вас зовсім не цікавить фреймворк NancyFX і микросервисы на платформі .NET, створювані з його допомогою — почитайте про динозаврів!

Читати далі →

Готуємо ORM не відходячи від плити

image

Дана стаття не є закликом до екстремізму розробки велосипедів. Мета посту в тому, щоб добре зрозуміти механізм, часто його треба створити з нуля. Особливо це стосується такій ненадійній теми як ORM.

Читати далі →

«Хаос .NET-світі — розумна ціна за швидкість розвитку платформи»: інтерв'ю з Андрієм Акиньшиным (JetBrains)



Проект Rider (.NET IDE від JetBrains) дійшов до публічної EAP-версії — саме час докладно розпитати Андрія Акіньшина, одного з його розробників. Але Rider став не єдиною темою нового випуску «Без слайдів». Крім нього, поговорили
  • про бібліотеку BenchmarkDotNet, яку розробляє Андрій
  • про рух Microsoft до опенсорсу і кроссплатформенности
  • про загальний стан .NET-світу і, звичайно,
  • .NET-конференції DotNext (яка, до речі, відбудеться в Москві вже в цю п'ятницю)


Як завжди, під катом є повна розшифровка інтерв'ю.




Читати далі →

«Попит на Visual Studio для Mac великий» — інтерв'ю з Alex Thissen



Недавно Microsoft представила Visual Studio for Mac і багатьох вразило рішення випустити флагманський продукт для чужий платформи після багатьох років Windows-ексклюзивності. Але все не так просто: представлений продукт не повний аналог звичної Visual Studio, а перейменована і доповнена Xamarin Studio, потрапила в руки Microsoft з купівлею Xamarin. Що ця новина означає для розробників? Ми вирішили задати кілька питань девятикратному Microsoft MVP Алексу Тиссену (Xpirit), активно стежить за подіями в .NET-світі.

Читати далі →

Лінь, рефлексія, атрибути, динамічні складання

Невеликий досвід, отриманий завдяки ліні

Роки три тому, я працював на одну фірму. Було нас 4 програміста. Один писав бізнес логіку програми. Описував він її за допомогою інтерфейсів (interface). Логічні зв'язки, залежності і т. д. Наше ж завдання було реалізувати ці інтерфейси і пов'язати з GUI. Основною проблемою в цій системі були постійні зміни структури зв'язків і параметрів. Тобто нам доводилося постійно займатися правкою і рефакторінгом.

Я людина досить ледачий. Тому прийшла думка — невже не можна якось це автоматизувати. І я сів за книжки.

перший Крок

Перша ідея була достатня явна і проста. Інтерфейси міститися в окремих файлах — так чому б не розпарсити їх і створити текстовий файл зі згенерованим класом. Так і було зроблено.

На жаль тих джерел не збереглося, але є аналог, кому цікаво, може подивитися(класи будуються на основі таблиць бази даних)
Читати далі →