15.08.2018 HttpWebRequest и session aborted
 
Всем привет!
давно юзаю примерно вот такой код
using(var httpWebResponse = (HttpWebResponse)_HttpWebRequest.GetResponse())
{
    using(var responseStream = httpWebResponse.GetResponseStream())
    {
        return (TResponse)new DataContractJsonSerializer(typeof(TResponse)).ReadObject(responseStream);
    }
}

недавно вдруг он перестал работать — httpWebResponse.ContentLength = -1 всегда (все остальные статусы в норме)
соответственно, ничего не десериализуется

пробовал подключать Фидлер — в нем видно, что все данные приходят правильно (корректный json)
и он же же показывает aborted session
SESSION STATE: Aborted.
Response Entity Size: 916460 bytes.

== FLAGS ==================
BitFlags: [IsHTTPS, ClientPipeReused] 0x9
X-ABORTED-WHEN: SendingResponse
X-CLIENTIP: 127.0.0.1
X-CLIENTPORT: 12374
X-EGRESSPORT: 12453
X-HOSTIP: 178.248.237.15
X-PROCESSINFO: test:6968
X-RESPONSEBODYTRANSFERLENGTH: 916 460
X-RETRYONFAILEDRECEIVE: *
X-SERVERSOCKET: REUSE ServerPipe#33*NEW*
...
Overall Elapsed: 0:00:01.510

The response was buffered before delivery to the client.


откуда это все стало происходить и как с этим бороться?
спасибо...

14.08.2018 return и ?
 
Почему функция, если v == 0 возвращает 0?
private int getValue(int v)
{
    return v == 0 ? v++ : v;
}

13.08.2018 C# и метапрограммирование
 
Всем хай!
Наверно многие уже сталкивались, что метапрограммирование в некоторых случаях может оказаться очень полезным.

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

Есть ли в студии какая-то поддержка для подобного процесса и можно ли его осуществить?

PS. Есть Т4, но не понимаю можно ли его для такой цели использовать и как, и думаю это всё таки не то, что хотелось бы.

10.08.2018 2D-Linq и оптимизация цифровых фильтров - 3.5
 
Ну, вот и пятница.
It's been a while, коллеги, it's been a while.

В прошлый раз у нас развернулась жаркая дискуссия, в которой было сформулировано несколько ценных идей.
К сожалению, заявленных высот
Автор: Sinclair
Дата: 29.06 12:40
достичь пока не удалось, но "в нашем проекте достигнут важный майлстоун: нам удалось собрать его без ошибок компиляции!"
Поэтому эта часть имеет номер не 4, а 3.5.
Нужно было решить вопрос с "нечестностью", поднятый некоторыми коллегами в прошлый раз.
Так что код теперь — на гитхабе: https://github.com/evilguest/linq2d
Любой желающий может его собрать и запустить у себя.
А заодно и попробовать свои силы в конкурсе красоты кода.

Для того, чтобы это сделать, нужно
  1. Добавить свой класс-фильтр в проект FilterTests. Он должен реализовывать либо IArrayFilter<int>, либо IWrapperFilter<int>. Можно отнаследоваться от ArrayFilterBase, тогда в свойстве Data будет доступен массив, заготовленный для фильтрации.
  2. Добавить этот тип в список параметров для FilterType
И, собственно, всё.
На самом деле, достаточно реализовать интерфейс IFilter<int> и в методе Initialize подготовить какую угодно структуру данных (если не устраивают ни встроенные массивы, ни интерфейс IArray).
Методы C4 и С8 ищутся по имени.
Главное, чтобы тип возвращаемого результата реализовывал IStructuralEquatable и умел поэлементно сравниваться с IArray2d<int> — см. ArrayWrapper<T>, и, в частности, static private bool Equals(IArray2d<T> left, IArray2d<T> right, IEqualityComparer comparer)

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

Ну, а дальше мы будем сравнивать красоту и производительность
В текущей версии теста сравниваются не все фильтры, которые я реализовал в процессе творческих поисков, а только наиболее характерные:
  1. BasicArrayFilter — самый простой и очевидный код, двойной цикл по входному массиву. Никаких косвенных вызовов, но проверки выхода за диапазоны пять раз за итерацию. Выступает в качестве критерия корректности.
  2. UnsafeFilter — код, написанный упоротым шарпистом, который любит ансейф. Ни косвенных вызовов, ни проверок границ. Там, в принципе, есть ещё способ выжать пару тактов во внутреннем цикле, но уже с трудом
  3. BestLinkFilter — это "мой кандидат", который претендует на победу:
    using System.Linq.Processing2d;
    using System.Linq.Processing2d.FastUnsafe;
    
    namespace FilterTests
    {
        public class BestLinqFilter : ArrayFilterBase, IArrayFilter<int>
        {
            public int[,] C4() =>
                    from d in Data.AsRelative(Bounds.Skip) select (d[-1, 0] + d[0, -1] + d[0, 1] + d[1, 0]) / 4;
    
            public int[,] C8() =>
                    from d in Data.AsRelative(Bounds.Skip)
                    select (d[-1, -1] + d[-1, 0] + d[-1, 1]
                          + d[ 0, -1]       +      d[ 0, 1]
                          + d[ 1, -1] + d[ 1, 0] + d[ 1, 1]) / 8;
        }
    }

    Критика того, что фильтр неявно принимает решение скипнуть границу, в которой ядро вычислить не удастся, принята — теперь мы явно задаём желаемую семантику в .AsRelative(). Никакие другие варианты, понятное дело, пока не работают, оставлены как задел на будущее.
  4. Фильтры DeferredLinqFilter и FastLinqFilter в бенчмарк не входят. Они иллюстрируют концепцию:
    • Во-первых, разные реализации Linq разведены в библиотеке Linq2d по разным неймспейсам. Таким образом, меняя using, можно легко переключаться между "экспериментальной" и "стабильной" версиями в коде клиента
    • Во-вторых, для отложенных вычислений приходится принудительно вызывать на результате ToArray(), иначе этот бенчмарк выигрывает с большим отрывом . Если вы будете строить аналогичную конструкцию, то не забудьте обеспечить готовность результата внутри бенчмарка, т.к. валидация с проверкой каждого значения в измерения производительности не входит.
Ну, и на десерт: сравнение, собственно, производительности у трёх упомянутых фильтров. BasicArrayFilter, конечно же, брать за ориентир не стоит — как было эмоционально отмечено в предыдущей дискуссии, "такое никто не пишет".
Поэтому за 100% мы берём UnsafeFilter. Для массива 1000*1000, на моём Lenovo T460 получается вот такой результат:

Filter Class C4 C8
BestLinqFilter 69.18% 70.44%
UnsafeFilter 100.00% 100.00%
BasicArrayFilter 293.76% 378.16%
То есть "красивый" фильтр отрабатывает примерно на треть быстрее, чем "некрасивый, но быстрый". И это ещё не предел

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

09.08.2018 Атрибуты и ограничения
 
У Рихтера и вообще многих авторов пишут что атрибуты можно ограничить применимость (классам, интерфейсам, методам и т.д. короче все задается флагами AttributeTargets)

Но если обратить внимание на один хитрый атрибут(напишу ниже), то оказывается ограничение можно делать более сложным!
А вот пример этого хитрого и всем знакомого атрибута
        [StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
        public struct SomeStruct1
        {
            [FieldOffset(0)]
            public bool value;
        }

        [StructLayout(System.Runtime.InteropServices.LayoutKind.Explicit)]
        public struct SomeStruct2
        {
            [FieldOffset(0)]
            public bool value;
        }

Как мы видим что атрибут FieldOffset реагирует во время компиляции на значение перечисление LayoutKind

Кто-то реализовывал такие хитрые ограничения атрибутов? Или это чисто фишка компилятора сделана только для FieldOffsetAttribute ???
Я всегда делал проверку на валидность во время выполнения, но считаю иногда очень удобно это делать на уровне компиляции. Кто-нибудь разбирался с этим вопросом?

08.08.2018 [unsafe] какая то ерунда
 
Приветствую всех!
Начну с простого кода
        [StructLayout(LayoutKind.Sequential, Pack = 4)]
        public struct Example
        {
            public bool a1;
            public bool a2;
            public bool a3;
            public bool a4;
            public bool a5;
            public bool a6;
            public bool a7;
            public bool a8;
            public bool a9;
        }

        static unsafe void Main(string[] args)
        {
            Example ex = new Example();
            ex.a1 = true;
            ex.a2 = true;
            ex.a3 = true;
            ex.a4 = true;
            ex.a5 = true;
            ex.a6 = true;
            ex.a7 = true;
            
            int size = Marshal.SizeOf<Example>();

            IntPtr ptr = Marshal.AllocHGlobal(size);
            Marshal.StructureToPtr(ex, ptr, false);

            Example* exPtr = (Example*)ptr.ToPointer();

            Example exNew = Marshal.PtrToStructure<Example>(ptr);

            if(ex.a1== exNew.a1
                && ex.a2 == exNew.a2
                && ex.a3 == exNew.a3
                && ex.a4 == exNew.a4
                && ex.a5 == exNew.a5
                && ex.a6 == exNew.a6
                && ex.a7 == exNew.a7
                && ex.a8 == exNew.a8
                && ex.a9 == exNew.a9)
            {
                Console.WriteLine("OK");
            }
            else
            {
                Console.WriteLine("Error");
            }

            if (exPtr[0].a1 == exNew.a1
                && exPtr[0].a2 == exNew.a2
                && exPtr[0].a3 == exNew.a3
                && exPtr[0].a4 == exNew.a4
                && exPtr[0].a5 == exNew.a5
                && exPtr[0].a6 == exNew.a6
                && exPtr[0].a7 == exNew.a7
                && exPtr[0].a8 == exNew.a8
                && exPtr[0].a9 == exNew.a9)
            {
                Console.WriteLine("OK");
            }
            else
            {
                Console.WriteLine("Error");
            }
         }

Поясните мне пожалуйста, почему на консоль выводит следующие строчки:
OK
Error



06.08.2018 ms sql ключевое поле
 
как получить значение ключевого поля при добавлении в таблицу?

пробывал через SELECT SCOPE_IDENTITY — ошибка привидения типов

SqlCommand scp = new SqlCommand("select count( name) FROM Accounts WHERE Accounts.name=@name;", connection);
            scp.Parameters.Add(new SqlParameter("@name", name));
            int no=(int)scp.ExecuteScalar();
            if (no > 0)
                return false;
            SqlCommand sc = new SqlCommand("insert into Accounts (name,pass) VALUES (@name,@pass); SELECT SCOPE_IDENTITY();", connection);
            sc.Parameters.Add(new SqlParameter("@name", name));
            sc.Parameters.Add(new SqlParameter("@pass", pass));
            //sc.ExecuteNonQuery();
            Int64 i = (Int64)sc.ExecuteScalar();//ошибка привидения типов

30.07.2018 На чём бы развернуть окружение для тестирования вредоносного .NET-кода?
 
Доброго дня!
Существуют ли готовые решения для тестирования потенциально вредоносного .NET-кода?

Хочется, указать папку с проектом и аргументы командной строки. Получить результаты из StdErr/StdOut.
Нужна возможность чтения и записи двух конкретных файлов на диске. Ограничение по объему желательно, но не обязательно.

В голове крутятся волшебные слова Virtual + Linux + Docker + NET Core, но это конструктор, который придётся факультативно настраивать, а потом долго тестировать на предмет уязвимостей.

30.07.2018 асинхронные сокеты
 
можно ли смешивать асинхронные сокеты с блокирующими
например читать через BeginReceive а отсылать через Send ?
заранее спасибо!

24.07.2018 ms sql
 
1 как сделать чтобы в поле ms sql было уникальным?
2 можно ли создать mdf файл программно?

23.07.2018 странность с GC.Collect после последнего авто-обновления .Net
 
Всем привет!

После наката последнего обновления в винде (в котором было и обновления для .Net) отвалился тест.
После упрощения имеем следующий код который стал работать по другому...

        static void Main(string[] args) {
            var obj1 = new object();
            var wr = new WeakReference(obj1);
            Console.WriteLine(wr.IsAlive);
            obj1 = null;
            GC.Collect();
            Console.WriteLine(wr.IsAlive);

            Console.ReadKey();
        }

неделю назад было
True
False
что ожидаемо и верно.

стало
True
True

WTF???

ps в пропертях проекта стоит Target framework=.Net 4 и сборка debug, при release сборке ок, но при дебаг тоже должно же быть ок!?

23.07.2018 помогите найти ошибку
 
помогите найти ошибку! выскакивает окно с надрисью

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Data.dll
Additional information: Внутренняя ошибка поставщика данных .Net Framework Data Provider 1.


во время закрытия базы данных в диструкторе
(причем если вызвать освобождение не в диструкторе ошибки не будет)
namespace BoleroServer
{
class db
{
public SqlConnection connection;
private static db instance=null;

db() {
string connectionString = @"Data Source=.\SQLEXPRESS;
AttachDbFilename=C:\Users\vvva.GOMEL0\Desktop\f.mdf;
Integrated Security=True;
Connect Timeout=30;
User Instance=True";
// Создание подключения
connection = new SqlConnection(connectionString);//
connection.Open();
}
~db() {
if (connection != null)
connection.Close();//здесь ошибка
connection = null;
}
static public db getInstance() {
if (instance == null)
instance = new db();
return instance;
}

}
}

в чём может быть косяк?

23.07.2018 Генерация на основе T4-шаблона при изменении другого файла
 
Всем привет!

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

Можно ли это сделать стандартными средствами?

P.S. Благодаря помощи Михаила Романова, я уже написал собственный генератор для другой задачи, и он умеет группировать и отслеживать изменения в нескольких файлах. Но в данном случае хочется обойтись стандартными средствами, без необходимость встраивать кастомные тулы в окружение билдера.

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

20.07.2018 Глобальный mutex
 
Есть сервер, есть программа, которая должна выполняться в одном экземпляре (например, работа с COM портом)
На сервере могут одновременно работать несколько пользователей ( RDP )
Использование Mutex решает проблему частично — т.е. блокируется запуск второго экземпляра программы, но только для пользователя, из-под которого эта программа запущена.
Т.е. в другой сессии рабочего стола эта программа запускается.
Как сделать, чтобы можно было запустить только один экземпляр для всей системы?

19.07.2018 NPOI Word картинка
 
https://stackoverflow.com/questions/23514781/add-image-to-word-docx-using-npoi-library-c-sharp

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

18.07.2018 C# vNext nullable reference types
 
Кто еще не в курсе смотрите видос

https://youtu.be/CU5DEWZXgSI?t=39m19s

В новой версии будет опция, делающая ссылочные типы по умолчанию, не принимающими null.
Чтобы можно было передать null там где требуется string придется написать string?.
При обращении к optional-ref переменной компилятор будет проверять возможно ли обращение к null и ругаться.

18.07.2018 NPOI Word
 
Есть такая библиотека POI для Java и аналог для c# npoi. Не могу найти пример как поменять текст в Word по шаблону. Есть на java пример, но аналогов классов не нашёл, использовал reflector. Видел другие библиотеки npoi, какие-то дополнения, может в них?

17.07.2018 [ANN] linq2db.EntityFrameworkCore
 
Всем привет.

Мы наконец-то отрелизили первую версию сего гибрида и приглашаем попробовать.
Краткое введение тут linq2db.EntityFrameworkCore

Для чего это может пригодится:
  • вам нужно запустить linq запрос который, по каким-то загадочныы причинам, не работает в EF Core. Их много, включая проблемы с группировкой.
  • вам нужна скорость материализации обганяющая Dapper — смотреть картинки
  • вам нужна быстрая вставка тысяч или больше записей.
  • вам нужно удалить, изменить, скопировать тысячи записей по условию, когда ченж трекер делает обоим серверам нехорошо.
  • вам нужен быстренький linq запрос по системным таблицам, не добавлять же новые сущности в красивую, стройную, выплаканую неделями модель — не дай бог миграции завалятся.
  • вам нужен cross database запрос — мы это готовим.
  • вам нужны кастомные агрегаты, оконные функции, CTE и тд. — хоть кто-то знает SQL
  • вам нужна работа с временными таблицами.
  • вы устали писать хранимки на каждый «нестандартный» чих.

Все точно не перечислил, но главные преимущества надеюсь сюда попали.
Просьба писать о найденых недочетах или неудобствах на гитхаб

14.07.2018 Почему нельзя так писать?
 
в рамках одной функции
       var Fraction = new { pos = 0, neg = 0, zero = 0 };
       var result = arr.Select(a => a > 0 ? Fraction.pos++ : (a < 0 ? Fraction.neg++ : Fraction.zero++));

13.07.2018 как установить dotnet core 1.1.2 на ubuntu 18.04
 
Package 'liblldb-3.6' has no installation candidate
сам пакет могу скачать, но он не устанавливается на 18.04
нужели только 2.1 можно установить?