18.10.2018 про BenchmarkDotNet и NuGet
 
Все привет!

Решил пощупать модный молодёжный BenchmarkDotNet.
Имеем VS2015 CE.
Создал пустой консольный проект, таргет поменял на .Net 4.6.1
Добавил туда простейший код из сэмпла.
Добавляю NuGet пакет BenchmarkDotNet последней версии и тут начинается интересное — в проект добавляется более десятка ссылок причем на базовую библиотеку, например:
System.Collections.Immutable
System.Console
System.IO.Compression
System.IO.FileSystem
System.Reflection.MetaData
System.Runtime.Serialization.Primitives
System.Security.AccessControl
System.Security.Cryptography.Algorithms

ну и тд, причем все они проинсталились локально в проект (то есть если смотреть в свойствах сборки path — они все ведут внутрь проекта), wtf???
почему в локальный проект добавилось столько ссылок? ведь BenchmarkDotNet по сути библиотека, и если ей что-то надо из BCL она внутри себя может иметь нужные референсы, так?
на офиц. сайте BenchmarkDotNet, сказано что пакет не имеет dependency!? почему в локальный проект проинсталилась куча сборок из BCL? в итоге размер занимаемого проектом места почти под 300М!

17.10.2018 Выборочные сборки в PackageReference
 
Есть сборка A.dll и B.dll , в обеих есть код:
namespace Namespace { class Class {} }


Также есть NuGet N, который зависит от B.dll и C.dll.


Далее есть проект X, который зависит от A через ProjectReference: <ProjectReference Include="..\A\A.csproj" />
И также зависит от N через PackageReference: <PackageReference Include="N" Version="1.0.0." />

При использовании Namespace.Class имеем неоднозначность.
Как сказать, чтобы B.dll не использовать при сборке, а C.dll можно.

К сожалению в PackageReference можно выбрать либо всё либо ничего.
https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files

16.10.2018 Оконная функция, или что-то похожее...
 
Привет.

Есть поток значений.
Значения скачцт вверх и вниз(больше/меньше).
Нужно сделать так чтоб если значение попадает в указанный диапазон, определять это событие. И нужно какимто образом сделать это окно(диапазон), вроде прилипающим чтоле... Чтоб избежать лишних срабатываний если следующее придшее значение будет незначительно ниже или выше этого "окна"..

Подскажите как это сделать, или что гуглить.

UP.

Может сделать это по тригерной логике? Когда значение достигает порога вхождения в "окно" — тригер срабатывает, а чтоб тригер сработал в обратну сторону значение должно достичь противополодной граници окна?
Как такое называется?

15.10.2018 Пути к сетевым файлам длиннее 260 символов
 
Здравствуйте!

Проблема у нас — приложение не может прочитать файлы в сети, если их полное имя (путь плюс файл) длиннее 260 символов.
  • .NET Framework версии 4.7.2
  • Если лезу Far Manager-ом — то всё читается,
  • Если лезу Windows Explorer-ом, ты выдает "The file name is too long". При этом имя файла я вижу, но открыть файл не могу.
  • Приложение не ругается, что путь слишком длинный, оно говорит, что System.IO.DirectoryNotFoundException: Could not find a part of the path ...
  • Длинные пути в .NET разрешены, я проверял через включение отключение этого флага в App.Config: Switch.System.IO.BlockLongPaths
  • Если файл создан локально с путем длиннее 260 символов, то все отрабатывает корректно

Это что, какое-то ограничение на уровне сети?

13.10.2018 Почему не видно extension method?
 
        public static AAADto GetExistingAAADto(this List<AAADto> lst1, AAADto aaaFromFile)
        {
        }

...

        var aaaOnAir = aaaOnAir.GetExistingAAADto(aaaFromFile);


Получаю вот такое при компиляции:

3> error CS1061: 'List<AAADto>' does not contain a definition for 'GetExistingAAADto' and no accessible extension method 'GetExistingAAADto' accepting a first argument of type 'List<AAADto>' could be found (are you missing a using directive or an assembly reference?)



Что ему не нравится? И как мне написать extension method в таком случае правильно?

13.10.2018 Однозначный формат даты
 
У нас дата указывается вполне логично: от меньшего к большему. Т.е. 10.09.2018 — это 10 сентября.

У американцев все наоборот непойми как — 10.09.2018 — это 9 октября Но у них принято использовать не точку а дробь (но не все парсеры об этом знают).

В связи с этим имею проблему при импорте в Excel через ClosedXML. Там если указывать дату — то Excel отчухрыживает время (в Excel нет типа DateTime — есть отдельно Date и отдельно Time). Если в виде текста — то Excel все-равно самостоятельно пытается преобразовать на основе локальных настроек.

Кто сталкивался и что делать?

12.10.2018 .NET Core 3.0 will expose SIMD instructions as API’s
 

.NET Core 3.0 will expose SIMD instructions as API’s that are available to managed code directly, making it unnecessary to use native code to access them.

ссылка

11.10.2018 Нужна библиотека протоколирования вызовов для .NET
 
Коллеги, посоветуйте библиотеку для трассировки вызовов, к-рая могла бы писать названия вызванных функций, переданные в них параметры , а также затраченное время на выполнение. При это модификации исходного кода должно быть по минимуму, т.е. вариант в начале функции написать log.Start(), а перед выходом log.End() — не канает. В идеале ее надо просто линкануть к существующему проекту , навесить на особо интересные функции атрибуты и получить при выполнении лог. Кто что посоветует? .NET от 4 до 4.7.1

09.10.2018 AssemblySignatureKeyAttribute - идиотизм или нет?
 
Смотрю AssemblySignatureKeyAttribute.

Детальнее как заюзать тут.

Нужна эта штука для совместимости.

Если раньше на вашу сборку ссылались по строгому имени, сформированному по алгоритму SHA1 (а конкретно PublicKeyToken), то вы можете сохранить это же строгое имя (дабы не ломать зависимости), но при этом подписать сборку с использованием SHA256+RSA.

Но товарищи. Зачем вообще было переходить на SHA256, если для PublicKeyToken используется всего 8 (ВОСЕМЬ) байт из 20? Типа если вы возьмете 8 байт от SHA256 хеша — это будет безопаснее, чем взять 8 байт от SHA1 хеша?

Либо сделайте PublicKeyToken все 20/32 байт, либо не морочьте людям голову.

08.10.2018 pin/unpin app to taskbar/start menu
 
можно вообще какой-то свой custom handler / interceptor написать, чтобы при "pin" привязывать приложение к другому месту, т.е не тому, которое приложение себе выбирает?

07.10.2018 Реализация TaskAwaiter - корректна ли?
 
В общем, задача стала для .Net 4.0 сделать ограниченную (упрощенную) поддержку async/await любой ценой. Есть NuGet-пакет для этого Microsoft.Bcl.Async. С ним проблема — он не работает на ограниченных привелегиях (в песочнице).

Однако для поддержки самого функционала он не нужен — достаточно пакетоа Microsoft.Bcl.Build (это минимум) ну и Microsoft.Bcl. Эти оба работают.

Ввиду того, что Microsoft.Bcl.Async никак не удалось заставить работать в песочнице, пришлось самому написать примитивнейший TaskAwaiter.

Честно сказать, дело было ночью и голова работает так себе. Как внутри устроено async/await детально не разбирался, но пока делал вроде стало более-менее понятно.

Задача была — чобы работал тот код, который уже написан с минимальными силами.

Собственно, вот такое получилось и оно вроде работает (не знаю, всегда ли будет установлен SynchronizationContext.Current, но в моих случаях он всегда установлен):

    internal class TaskAwaiter : INotifyCompletion
    {
        private readonly Task _task;

        public bool IsCompleted => _task.IsCompleted;

        public TaskAwaiter(Task task)
        {
            _task = task ?? throw new ArgumentNullException(nameof(task));
        }

        public void OnCompleted(Action continuation)
        {
            if (null == continuation)
                throw new ArgumentNullException(nameof(continuation));

            var synchronizationContext = SynchronizationContext.Current;

            _task.ContinueWith(t =>
            {
                synchronizationContext.Post(state => { continuation(); }, null);
            });
        }

        public void GetResult()
        {
            if (_task.IsCanceled)
                throw new TaskCanceledException();

            if (_task.IsFaulted)
            {
                var taskException = _task.Exception;
                var innerException = taskException?.InnerException;

                if (null != innerException)
                    throw innerException;

                throw taskException;
            }
        }
    }


Кто понимает принцип работы и что тут можно исправить?

06.10.2018 Найти расширение MethodInfo.FullName
 
Смотрю в отладчике не содержимое объекта класса System.Reflection.MethodInfo

http://files.rsdn.org/84/2018_10_06__MethodInfo__FullName.PNG

И вижу у него то, что мне нужно — свойство FullName.

Но походу это расширение — в самом классе такого свойства нет.

Как мне найти в каком пространстве имен находится это расширение?

"using System.Reflection" не помогает.

В описании MethodInfo про FullName тоже ни слова.

Сам проект связан с EntityFrameworkCore.

05.10.2018 Blazor. Как запустить сэмпл из командной строки?
 
Проект вроде собрался нормально; пытаюсь запустить сэмпл StandaloneApp из командной строки, но оно не работает. Какие специальные движения с бубном нужны?
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>

05.10.2018 IP пользователя за NAT-ом
 
Как лучше извлечь не только публичный IP-адрес, но и тот который внутренний в его локальной сети? Есть ли методы в ASP.Net?

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

03.10.2018 Socket KeepAlive или формирование второго канала передачи данных.
 
Коллеги, доброго дня.

Есть клиент-серверное приложение. С одной стороны выполняется Socket.Send, с другой — Socket.Receive. Всё это обёрнуто в NetworkStream с кучей обёрток поверх, но это уже не важно.

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

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

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

И вот тут встаёт вопрос — а как получить этот второй канал передачи? Out-of-band data вычеркиваем — любой роутер без поддержки разломает столь изящное решение. Windows 95 вообще уходила от них в синьку. Не знаю, изменилось ли что-нибудь в лучшую сторону с тех пор. Что ещё можно сделать? Как получить второй, независимый канал передачи данных, имея на руках только подключённый Socket?

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

Спасибо за любые идеи.

01.10.2018 string.StartsWith(char). netstandard2.0 и netcoreapp2.0.
 
Пишу модульные тесты (.NET Core 2.0) для библиотеки классов (.NET Standard 2.0).

В тестах у string есть метод StartsWith(char).

#region Сборка System.Runtime, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.netcore.app\2.0.0\ref\netcoreapp2.0\System.Runtime.dll
#endregion

using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;
using System.Security;
using System.Text;

namespace System
{
 //
 // Сводка:
 //     Represents text as a sequence of UTF-16 code units.
 [DefaultMember("Chars")]
 public sealed class String:IEnumerable<char>, IEnumerable, IComparable, IComparable<String>, IConvertible, IEquatable<String>, ICloneable
 {

А в библиотеке у string такого метода нет.

#region Сборка netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
// C:\Users\Dima\.nuget\packages\netstandard.library\2.0.3\build\netstandard2.0\ref\netstandard.dll
#endregion

using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;
using System.Text;

namespace System
{
 //
 // Сводка:
 //     Represents text as a sequence of UTF-16 code units.
 [DefaultMember("Chars")]
 public sealed class String:IEnumerable<char>, IEnumerable, ICloneable, IComparable, IComparable<String>, IConvertible, IEquatable<String>


Я правильно понимаю, что netstandard.dll работает через System.Runtime.dll, но режет часть методов?

----
Я про это вроде читал год(?) назад, но первый раз столкнулся на практике

29.09.2018 Аннотации и контракты
 
1. Используется ли сие на проде на регулярной основе?
Насколько это гибко и помогает в разработке?

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

3. Чьи используете?

28.09.2018 SendInput() from Windows Service
 
Нужен сабж.
Как я понял, это не то чтобы совсем невозможно, но нормального решения нет. Нужно создавать дочерний процесс. У кого-то есть опыт? Спасибо

27.09.2018 [Reflection] свойства
 
Нужно для некоего класса получить набор всех полей и свойств.
С полями всё вроде бы просто и понятно, а со свойствами есть нюанс:
они могут быть виртуальные, они могут перегружаться через new или являться реализацией какого-либо интерфейса.

Скажем, есть такие классы:

public interface IA
{
string Property { get; }
}

public class A: IA
{
private string _property;

public virtual int VirtualProperty { get; set; }
public string Property { get => _property; set => _property = value; }
}

public class B: A
{
private string _property2;

public override int VirtualProperty { get => base.VirtualProperty; set => base.VirtualProperty = value + 1; }
new public string Property { get => _property2; set => _property2 = value; }
}

Для класса B нужно получить 3 PropertyInfo.
один VirtualProperty, и два для Property.
ЗЫ. VirtualProperty один потому что он "нормальный" виртуальный и даже если его получить для класса A, у него правильно отработает SetValue, вызвав метод из класса B.
Можно конечно забить и получить 4 свойства, но тогда дважды будет выполняться работа для виртуальных свойств.

26.09.2018 Long Time Support (или как?) версии .Net
 
Вот, вы можете сделать прогу под .Net и вам хватит предыдущей версии. Но вы, чтобы быть в ногу со временем — скомпилите под самую последнюю — 4.7.2 А ведь у юзверя ее может не оказаться на компьютере и ему придется скачивать, тратить дрогоценное время.

По этому желательно выделить некие LTS-версии, чтобы не гнаться за новым.

Объективной LTS является .Net 4.0, ибо она последняя, которая работает на Windows Server 2003. Да, их мало кто используют, но некоторые сценарии все же могут быть (могут держать старый сервер за NAT-ом на Win 2003 потому что он тупо работает, подключиться извне к нему нельзя, по этому вопрос безопасности остро не стоит). Но это отдельные случаи.

Далее. Можно учитывать предустановленные в OC, но тут глухо, ибо даже в Win 7 изначально предустановлена 3.5, а остальные ставят с обновлениями.

В Windows 8 предустановлена 4.5 — можно назвать ключевой (в Windows 8.1 — 4.5.1).

В Windows 10 — предустановлена 4.6.

Посколькуо Windows 8/8.1 используют мало а .Net 3.5 — точно не вариант (т.е. пользователи Windows 7 по любому должны поставить/обновить), то LTS версиями можно считать эти две:

4.0 (за то что работает на Windows Server 2003)
4.6 (за то что установлена на Windows 10)

Тем более что в новых версиях ничего особенно ценного не добавили.

Итак, если хотите поддерживать старых пользователей/особые случаи — то скомпилить под .Net 4.0. Для остальных случаев скомпилить под .Net 4.6. Так или нет?