20.09.2018 Взаимодействием между .net программами
 
Здравствуйте,

Есть две программы:
одна сделанная на asp .net core 2.1
вторая на wpf .net 4.7

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

Есть идея для этих целей использовать: memory mapped files , но может в .net есть более удобный вариант,
типа вызова метода из одного .net приложения в другом?

17.09.2018 Отслеживание изменений объектов
 
Нет ли случайно какой библиотеки или может кто подскажет в какую сторону копать.
Имеется дурацкая задача:
Есть некий объект, который хранит ссылки на другие объекты, те хранят еще на что-то ссылки и т.д.
Нужно перед выполнением метода сохранить текущее состояние всех объектов (все нужные объекты достижимы из "главного"). Потом в методе что-то меняется, я не знаю какие объекты могут измениться, может какое-то int свойство, может в коллекции элементы местами поменяются.
Нужно соответственно определить какие объекты изменились, при необходимости — вернуть как было раньше.
Пока в голову пришло только перебирать рефлексией все свойства и члены "главного" объекта. Проверять тип. Для примитивов свою проверку делать, для коллекций — свою,... Хранить множество уже проверенных объектов, чтобы в бесконечный перебор не попасть. Чую только фигня получится и с коллекциями всякими и строками придётся хардкодить, что потом какой-нибудь StringDictionary не сожрётся или еще чего вылезет.
Можно конечно намутить какой-нибудь IPropertyNotifyChanged, переписать все свойства, закрыть члены классов и по событиям отслеживать кто поменялся но и это дичь какая-то, да и с каким-нибудь List'ом непонятно что делать или везде свои обёртки над коллекциями совать.
Еще и само сравнение непонятно как лучше делать. Не то сериализовать объекты в массив байт и сравнивать, не то через ту же рефлексию поэлементно сравнивать методом Equals.

14.09.2018 .Net Core нужен?
 
Всем доброго!
Если текущий проект работает на windows и .Net .. и вроде бы всё нормально.
Имеет ли смысл задумываться о переходе под .Net Core ? если да (и нет) то почему?

Вообще какие у мС планы и тенденции относительно версий .Net .... слышал кроме стандартного .Net и .Net Core есть ещё какие-то версии... это так?

upd1. Слышал в частности что вроде в core более хороший jit, умеет больше оптимизаций и лучше код делает, как следствие чуть быстрее всё...
С этой точки зрения есть какая-то более точная инфа?...

12.09.2018 ДКА, linq и экспоненциальный взрыв
 
Здравтсвуйте.

Тут
Автор: Ночной Смотрящий
Дата: 11.09 20:00
вот дискуссия завезалась на счет экспоненциального взрыва состояний при генерации ДКА в linq.
На сколько это правда в теории и на практике? Разве для каждого linq expression не будет построен свой отдельный автомат,а будет генерится один большой и общий?
Говорят jb переписало весь код с linq по ентой причине или из-за проблем с памятью?

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


 static void Main(string[] args)
        {
            int cnt = 0;
            while (Console.ReadLine().Length < 3)
            {
                var appDomain = AppDomain.CreateDomain($"test, cnt");
                var assemblyName = new AssemblyName
                {
                    CodeBase = @"d:\SharedDll.dll"
                };
                Assembly assembly = appDomain.Load(assemblyName);

                var theType = assembly.GetType("SharedDll.Class1");
                var c = Activator.CreateInstance(theType);
                var method = theType.GetMethod("Get");
                var retVal = method.Invoke(c, new object[] { });
                
                Console.WriteLine(retVal);
                cnt++;
                AppDomain.Unload(appDomain);

                GC.Collect(); // collects all unused memory
                GC.WaitForPendingFinalizers(); // wait until GC has finished its work
                GC.Collect();
            }

            Console.WriteLine("Finish");
            Console.ReadLine();
        }

11.09.2018 Транзакция на несколько файлов
 
Здравствуйте,

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

09.09.2018 Как такое сделать без блокировок?
 
Привет всем!

Пусть имеется множество строковых ключей. На нем вводится отношение эквивалетности, порожденное функцией ConstraintExpression.Canonize.
Этих ключей извне приходит большое количество, и по каждому нужно взять объект чтобы выполнить на нем относительно тяжеловесную обработку.
Для ключей в пределах класса эквивалентности вся обработка одинаковая. Однако инициализация перед ее началом занимает много ресурсов.
Инициализация частично отложенная, так что создать новый объект хоть и дороже, чем не создавать его, но гораздо дешевле, чем использовать
новый объект для вызова DoHardWork вместо ранее созданного эквивалентного.

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

public class Factory 
{
  public Constraint Create( string expression )
  {
    lock ( lock_ )
    {
      Constraint candidate;
      if ( map_.TryGetValue( expression, out candidate ) )
      {
        return candidate;
      }

      candidate = new Constraint( expression );
      var canonic = candidate.Canonic;
      
      Constraint result;
      if ( !map_.TryGetValue( canonic, out result ) )
      {
        result = candidate;
        map_[canonic] = result;
      }

      map_[expression] = result;
      return result;
    }
  }

  private readonly IDictionary<string, Constraint> map_ = new Dictionary<string, Constraint>( StringComparer.InvariantCultureIgnoreCase );
  private readonly object lock_ = new object();
}
public class Constraint
{
  public Constraint( string expression )
  {    
    Expression = expression;
    Canonic = Canonize( expression );      
  }
  public string Expression { get; private set; }
  public string Canonic { get; private set; }
  
  public string DoHardWork() {}
  
  private string Canonize( string key ) { return key.ToLower(); } // Только для примера
}

А вопрос в том, можно ли переписать фабрику без блокировок?

Спасибо.

08.09.2018 Конфигурация приложения
 
Как сегодня принято работать с конфигурацией приложений ?
Например есть https://github.com/anakic/Jot и аналоги.
Обычно делал вручную с xml файлом, но возможно время изменились и есть что-то лучше ?
Чем пользуетесь вы ?

06.09.2018 using TEST_COL_TYPE=byte[]
 
Не могу объявить %subj%.

Для простых типов/классов работает.

using TEST_COL_TYPE=byte;


Для массивов — нет.

using TEST_COL_TYPE=byte /*хочет здесь точку с запятой*/ [];


Что за фигня?

Может это можно по другому как то замутить?

Использую VS2017, "последний основной номер версии C# (по умолчанию)".

04.09.2018 Логирование потребления памяти
 
asp.net core 2.1 приложение в docker контейнере под линуксом. Падает из-за нехватки памяти. Из под студии отлаживать не возможно по ряду причин.
Как бы из него же залогировать потребление памяти хотя бы общее, а еще лучше — в ходе отдельных операций с данными.

03.09.2018 Вопрос про разграничение доступа
 
Привет всем!

Может ли кто посоветовать толковую статью или книгу про то, как грамотно сделать разграничение доступа в enterprise системе?
Задача иметь возможность минимальным количеством телодвижений сказать в коде, например, что открыть такой-то экран (конкретно
в моем случае это одностраничный веб-интерфейс и asp.net mvc на сервере), нажать такую-то кнопку или засабмитить такую-то
форму имет право такая-та категория пользователей. Или что на сервере глубоко внутри какого-то сервиса определенная операция
над определенным объектом разрешена не всем.

Про то, что этот вопрос надо решать в начале жизненного цикла, я в курсе, равно как и про стандартные методы, имеющиеся в
asp.net mvc, которых недостаточно.

Спасибо.

02.09.2018 ClosedXML.Report - как использовать?
 
Покажите, как использовать эту библиотеку для вывода DataTable в шаблон Excel?
На самом github документация как таковая отсутствует, в качестве примера использования приведен
    protected void Report()
    {
        const string outputFile = @".\Output\report.xlsx";
        var template = new XLTemplate(@".\Templates\report.xlsx");

        using (var db = new DbDemos())
        {
            var cust = db.customers.LoadWith(c => c.Orders).First();
            template.AddVariable(cust);
            template.Generate();
        }

        template.SaveAs(outputFile);

        //Show report
        Process.Start(new ProcessStartInfo(outputFile) { UseShellExecute = true });
    }

Даже если взять этот самый DbDemos из выложенных там же "test", то все равно не работает — ругается на LoadWith

Простое использование — замена идентификаторов на значение — не вопрос.
Но мне надо вывести таблицу (строки значений).
Может кто подкинет работающий пример?

31.08.2018 MySQL Update через mySqlDataAdapter и DataTable
 
Доброго времени суток все форумчанам.

На C# пишу недавно, раньше в основном с C++ работал.
Задача следующая: необходимо подключиться к БД MySQL, прочитать таблицу, загрузить ее в DataTable (для дальнейшего отображения через DataGridView), изменить запись в DataTable и сохранить измерения в БД.

Код программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using MySql.Data.MySqlClient;

namespace SQL
{
    class Program
    {
        static void Main(string[] args)
        {
            string server = "localhost";
            string database = "praktika";
            string uid = "root";
            string password = "";
            string connectionString = "SERVER=" + server + ";" + "DATABASE=" + database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";

            MySqlConnection connection = new MySqlConnection(connectionString);
            connection.Open();
            string SQL = "select * from praktika_practice_teachers";
            MySqlDataAdapter mySqlDataAdapter = new MySqlDataAdapter(SQL, connection);
            DataTable myTable = new DataTable("testtable");
            mySqlDataAdapter.Fill(myTable);
            myTable.Rows[0]["degree"] = "Was Tom";
            MySqlCommandBuilder myCB = new MySqlCommandBuilder(mySqlDataAdapter);
            mySqlDataAdapter.UpdateCommand = myCB.GetUpdateCommand();
            mySqlDataAdapter.Update(myTable);
            connection.Close();
        }
    }
}


структура таблицы:

http://zegsoft.ru/rsdn/01.jpg



Строчка mySqlDataAdapter.Update(myTable);
вызывает ошибку: нарушение параллелизма, UpdateCommand затронула 0 из ожидаемых 1 записи.

Возникающая ошибка:
http://zegsoft.ru/rsdn/error.jpg


Знающие люди, подскажите, что делаю не так?

31.08.2018 NLog - target.layout выводить сонтекст только если он установлен
 
Здравствуйте,

Пользуемся на проекте NLog логгером.
С некоторых пор стали использовать контексты (GDC, MDC, MDLC, NDC, NDLC).

Например
var contextID = "например ID сессии";
using (NestedDiagnosticsLogicalContext.Push(contextID))
{
    // ...
    log.Info("сообщение 1");
    // ...
    log.Info("сообщение 2");
    // ...
    log.Info("сообщение 3");
    // ...
}


соответсвенно в лог дополнительно к самим текстам сообщений можно выводить (в синтаксисе NLog layout) что-то вроде:
CONTEXT:${ndlc}
${longdate} ${level} CONTEXT:${ndlc}${newline}всё естальное


Но контекст далеко не всегда задан.
При этом я знаю, что в NLog можно layout с условиями задавать (я про $when).
Но вот тут и затык — я не могу сообразить, как его отформатировать так, чтобы "CONTEXT:${ndlc}" выводилось только, если контекст задан?

29.08.2018 Microsoft.DotNet.GlobalTools.Sdk
 
Пытаюсь снова включиться в работу

Не подскажите, что мне нужно установить, чтобы исчезла ошибка:

C:\Program Files\dotnet\sdk\2.1.401\Sdks\Microsoft.DotNet.GlobalTools.Sdk\Sdk not found. Check that a recent enough .NET Core SDK is installed and/or increase the version specified in global.json. dotnet-ef 1


Каталог "c:\Program Files\dotnet\sdk\2.1.401\Sdks" на компьютере есть.

А подкаталога "Microsoft.DotNet.GlobalTools.Sdk\Sdk" нет.
Я уже какую только херню не поставил — не появляется

25.08.2018 Отложенное выполнение очереди в Azure Service Bus
 
Ситуация
— есть topic в Azure Service Bus
— используются сессии, т.к. очередность важна
— сообщения перед отправкой в топик получают SessionId исходя из данных самого сообщения (т.е. SessionId генерируются на лету)
— количество и частота сообщений для каждого SessionId не известны, а частота еще и не постоянна

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

Для получения сейчас используется вариант IMessageSessionAsyncHandlerFactory

message.Abandon() или пересоздание сообщения c указанием задержки не варианты, т.к. текущее сообщение станет последним в очереди. Да и остальные сообщения сессии это не задержит.
Так же вычитать всю сессию не подходит. Если сообщения приходят быстро, то есть большая вероятность что после вычитывания всей сессии и до ее повторной публикации в topic успеют добавиться новые сообщения.
Можно приостанавливать получающий handler, но число handler конечно. Это приводит к уменьшению скорости обработки, а теоретически могут "встать" все handler (если в каждом будет по сбою)

Вроде перечитал все что в документации, но варианта как отложить сессию на заданное время не нашел. Может что упустил?

22.08.2018 Можно ли не указывать точный тип generic у C#
 
Здравствуйте Коллеги.

Подскажите как в C# можно решить следующую задачу. Есть такой класс:
class A<T>
{
    T value;
    public T Value { get { return value; } }
}

Проблема в том, что мне хочется его использовать следующим образом:
var a = new A<List<A<string>>();  // так можно
var a = new A<List<A>>();         // так нельзя, не указан тип для A<>. А мне очень надо :)

т.е. я хочу указать, что класс содержит список обьектов класса A, но их точный тип мне не известен. Например может быть так:
var a = new A<List<A>>();
a.Value.Add(new A<string>());
a.Value.Add(new A<int>());
a.Value.Add(new A<List<A>>());
// и т.д.

21.08.2018 Очень большой json-файл
 
Всем привет!

Есть сторонний очень большой json-файл (примерно 240 Гб(sic!, гигабайты, это не опечатка))
Представляет собой массив данных, структура элемента массива известна
Его надо как-то десериализовать и поэлементно запихать потом в таблицу
А как?
Стандартным способом вряд ли получится
internal void Deserialize<T>()
{
    var jsonSerializer = new DataContractJsonSerializer(typeof(T));
    using(var fileStream = new FileStream("veri_big.json", FileMode.Open, FileAccess.Read, FileShare.None, 4096, FileOptions.SequentialScan))
    {
        var result = (T)jsonSerializer.ReadObject(fileStream);
    }
}

Есть ли более другие варианты?
Спасибо...

21.08.2018 Как запретить наследование из public класса?
 
Всем привет!

Есть Dll, в которой примерно такой код:
public abstract class A
{
}
public abstract class B : A
{
}
public abstract class C : A
{
}

Вопрос: как закрыть для наследования класс A снаружи?
Чтобы можно наследоваться только от B и C
Спасибо...

21.08.2018 Push нотификации
 
Всем привет!

Есть desktop-приложение на net. Оно должно принимать push-нотификации от севера. Желательно с прозрачным контрактом (типа REST).

Сейчас это сделано на OWIN self host. Все хорошо, но возникают трудности при запуске приложения из под учетки пользователя без админских прав, т.к.
надо заранее с админскими правами зарезервировать url/port для этого (netsh http add urlacl url=http://+:9000/ ...).

Вопрос: как можно еще делать подобные push-нотификации на клиентское приложение, но без заморочек с портами и админскими правами, при условии, что сервер на Java?

Все происходит в локальной сети, java-код можно менять.