Задать вопрос
  • Entity Framework Core и MySQL - почему при чтении из БД и конвертации значения в DateTimeOffset теряются миллисекунды?

    Casper-SC
    @Casper-SC Автор вопроса
    Программист (.NET)
    Проблему удалось решить так:

    using System;
    using System.Linq;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
    
    namespace Domain.ValueConversion
    {
        public static class EntityFrameworkCoreModelBuilderExtensions
        {
            public static void AddDateTimeOffsetConverter(this ModelBuilder builder)
            {
                // SQLite does not support DateTimeOffset
                foreach (var property in builder.Model.GetEntityTypes()
                    .SelectMany(t => t.GetProperties())
                    .Where(p => p.ClrType == typeof(DateTimeOffset)))
                {
                    property.SetValueConverter(
                        new ValueConverter<DateTimeOffset, DateTime>(
                            convertToProviderExpression: dateTimeOffset => dateTimeOffset.UtcDateTime,
                            convertFromProviderExpression: dateTime => new DateTimeOffset(dateTime)
                        ));
                }
    
                foreach (var property in builder.Model.GetEntityTypes()
                    .SelectMany(t => t.GetProperties())
                    .Where(p => p.ClrType == typeof(DateTimeOffset?)))
                {
                    property.SetValueConverter(
                        new ValueConverter<DateTimeOffset?, DateTime>(
                            convertToProviderExpression: dateTimeOffset => dateTimeOffset.Value.UtcDateTime,
                            convertFromProviderExpression: dateTime => new DateTimeOffset(dateTime)
                        ));
                }
            }
    
            public static void AddDateTimeUtcKindConverter(this ModelBuilder builder)
            {
                // If you store a DateTime object to the DB with a DateTimeKind of either `Utc` or `Local`,
                // when you read that record back from the DB you'll get a DateTime object whose kind is `Unspecified`.
                // Here is a fix for it!
                var dateTimeConverter = new ValueConverter<DateTime, DateTime>(
                    v => v.Kind == DateTimeKind.Utc ? v : v.ToUniversalTime(),
                    v => DateTime.SpecifyKind(v, DateTimeKind.Utc));
    
                var nullableDateTimeConverter = new ValueConverter<DateTime?, DateTime?>(
                    v => !v.HasValue ? v : (v.Value.Kind == DateTimeKind.Utc ? v : v.Value.ToUniversalTime()),
                    v => v.HasValue ? DateTime.SpecifyKind(v.Value, DateTimeKind.Utc) : v);
    
                foreach (var property in builder.Model.GetEntityTypes()
                    .SelectMany(t => t.GetProperties()))
                {
                    if (property.ClrType == typeof(DateTime))
                    {
                        property.SetValueConverter(dateTimeConverter);
                    }
    
                    if (property.ClrType == typeof(DateTime?))
                    {
                        property.SetValueConverter(nullableDateTimeConverter);
                    }
                }
            }
        }
    }

    Источник, Лицензия

    using Microsoft.EntityFrameworkCore;
    using MySql.Data.EntityFrameworkCore.Extensions;
    
    namespace Infrastructure.Data.Contexts
    {
        /// <summary>
        /// Контекст для работы с БД событий.
        /// </summary>
        public class SystemEventContext : DbContextEx
        {
            public DbSet<SystemEvent> Events { get; set; }
    
            public SystemEventContext(DbContextOptions<SystemEventContext> options)
                : base(options)
            {
            }
    
            protected override void OnModelCreating(ModelBuilder builder)
            {
                const string TIMESTAMP_COLUMN_TYPE = "timestamp(3)";
               // ...
                base.OnModelCreating(builder);
               // ...
    
                builder.AddDateTimeOffsetConverter();
                builder.AddDateTimeUtcKindConverter();
            }
        }
    }
    Ответ написан
  • Возможно ли отлаживать React JSX код не в браузере, а из JetBrains WebStorm приложения?

    Casper-SC
    @Casper-SC Автор вопроса
    Программист (.NET)
    Выяснил, что, как оказалось, можно вполне себе успешно дебажить код в JetBrains Rider!!!

    Отлично, а то это была боль.
    Ответ написан
    Комментировать
  • Не работает аутентификация на основе Cookies (+JWT). Не сохраняются Cookies в браузере. Как исправить?

    Casper-SC
    @Casper-SC Автор вопроса
    Программист (.NET)
    Проблема была в том, что я развернул веб-приложение не настроив HTTPS, но с ним же всё дебажил. В куках был флаг secure, который отключается так:
    app.UseCookiePolicy(new CookiePolicyOptions
    {
        MinimumSameSitePolicy = SameSiteMode.Strict,
        HttpOnly = HttpOnlyPolicy.Always,
        // При включении HTTPS нужно вернуть CookieSecurePolicy.Always
        Secure = CookieSecurePolicy.None,
    });


    app.UseSecureJwt();
    app.UseAuthentication();
    // Не забыть вернуть в app.UseCookiePolicy параметр Secure = CookieSecurePolicy.Always,
    //app.UseHttpsRedirection();
    app.UseMvc();


    Теперь как временное решение можно оставить HTTP, но в итоге нужно просто настроить HTTPS.
    Ответ написан
    Комментировать
  • Как проверить нажат ли input?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    react.tips/radio-buttons-in-reactjs
    На странице Code snippet 11 (правда статью почитать всё-таки придётся).

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

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Сделал на основе вашего кода. Вообще нужно это всё писать немного иначе. Передавать ссылку в классы с алгоритмами на контролы - это очень плохая идея и сразу забудьте про такой подход.

    В этом примере если два раза нажать на пункт меню, то запустится два цикла в поток(е/ах) из пула потоков. Это уже сами обработаете.

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

    using System;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace ProgressBarExample
    {
        internal class Analyzer
        {
            private readonly SynchronizationContext _synchronizationContext;
    
            public Analyzer()
            {
                // Если экземпляр класса будет создан в UI потоке,
                // то здесь будет контекст синхронизации UI потока, иначе пула потоков
                _synchronizationContext = SynchronizationContext.Current ?? new SynchronizationContext();
            }
    
            public event EventHandler<AnalyzerEventArgs> ProgressChanged;
    
            public async Task<Data> LoadDataInDB()
            {
                var result = await Task.Run(async () =>
                {
                    for (int i = 0; i < 100; i++)
                    {
                        await Task.Delay(250);
                        OnProgressChanged(new AnalyzerEventArgs("line " + (i + 1), 100));
                    }
                    return new Data() { Text = "Данные " };
                });
                return result;
            }
    
            private void OnProgressChanged(AnalyzerEventArgs args)
            {
                // Перенаправляем выполнение в UI поток не ожидая пока отработает метод обработчик события.
                _synchronizationContext.Post(state =>
                {
                    ProgressChanged?.Invoke(this, (AnalyzerEventArgs)state);
                }, args); // args передаётся в переменную state (грубо говоря)
            }
        }
    }


    namespace ProgressBarExample
    {
        public class AnalyzerEventArgs
        {
            public int MaxLines { get; }
    
            public string CurrentLine { get; }
    
            public AnalyzerEventArgs(string currentLine, int maxLines)
            {
                CurrentLine = currentLine;
                MaxLines = maxLines;
            }
        }
    }


    namespace ProgressBarExample
    {
        public class Data
        {
            public string Text { get; set; }
        }
    }


    using System.ComponentModel;
    using System.Runtime.CompilerServices;
    using System.Windows;
    using System.Windows.Input;
    
    namespace ProgressBarExample
    {
        public partial class MainWindow : Window, INotifyPropertyChanged
        {
            private readonly Analyzer _analyzer;
            private readonly Style _normalBarStyle;
            private readonly Style _loadBarStyle;
            private readonly Style _errorBarStyle;
            private string _maxLines;
            private string _currentLine;
    
            public string MaxLines
            {
                get { return _maxLines; }
                set
                {
                    _maxLines = value;
                    OnPropertyChanged();
                }
            }
    
            public string CurrentLine
            {
                get { return _currentLine; }
                set
                {
                    _currentLine = value;
                    OnPropertyChanged();
                }
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            public MainWindow()
            {
                InitializeComponent();
    
                _normalBarStyle = FindResource("NormalStatusBar") as Style;
                _loadBarStyle = FindResource("LoadDataStatusBar") as Style;
                _errorBarStyle = FindResource("ErrorStatusBar") as Style;
    
                _statusBar.Style = _normalBarStyle;
                
                _analyzer = new Analyzer();
                _analyzer.ProgressChanged += OnAnalyzerProgressChanged;
            }
    
            private void OnAnalyzerProgressChanged(object sender, AnalyzerEventArgs args)
            {
                // Передавать каждый раз одно и тоже бессмысленно, сделаете сами как нужно
                MaxLines = args.MaxLines.ToString();
                CurrentLine = args.CurrentLine;
            }
    
            private async void LoadDataToDB_Click(object sender, RoutedEventArgs e)
            {
                _statusBar.Style = _loadBarStyle;
                Mouse.OverrideCursor = Cursors.Wait;
    
                try
                {
                    var data = await _analyzer.LoadDataInDB(); 
                    MessageBox.Show(data.Text);
                }
                finally
                {
                    Mouse.OverrideCursor = Cursors.Arrow;
                    _statusBar.Style = _normalBarStyle;
                }
            }
    
            protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }


    <Window
        x:Class="ProgressBarExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:local="clr-namespace:ProgressBarExample"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        Title="MainWindow"
        Width="800"
        Height="450"
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
        mc:Ignorable="d">
        <Window.Resources>
            <Style x:Key="NormalStatusBar" TargetType="DockPanel">
                <Setter Property="Background" Value="#FF007ACC" />
            </Style>
            <Style x:Key="LoadDataStatusBar" TargetType="DockPanel">
                <Setter Property="Background" Value="#9333FF" />
            </Style>
            <Style x:Key="ErrorStatusBar" TargetType="DockPanel">
                <Setter Property="Background" Value="#eb4034" />
            </Style>
        </Window.Resources>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="20" />
            </Grid.RowDefinitions>
            <Menu VerticalAlignment="Top">
                <MenuItem Header="File">
                    <MenuItem
                        x:Name="LoadDataToDB"
                        Click="LoadDataToDB_Click"
                        Header="LoadDataToDB" />
                </MenuItem>
            </Menu>
            <DockPanel
                x:Name="_statusBar"
                Grid.Row="1"
                Style="{StaticResource LoadDataStatusBar}">
                <!--  Style меняться во время выполнения LoadDataInDB()  -->
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <TextBlock
                        Grid.Column="0"
                        Margin="10,0,0,0"
                        Foreground="White"
                        Text="Статус данных" />
                    <DockPanel Grid.Column="1" HorizontalAlignment="Right">
                        <TextBlock
                            Margin="0,0,5,0"
                            Foreground="White"
                            Text="{Binding CurrentLine}" />
                        <!--  должно меняться во время выполнения LoadDataInDB()  -->
                        <TextBlock
                            Margin="0,0,5,0"
                            Foreground="White"
                            Text="/" />
                        <TextBlock
                            Margin="0,0,10,0"
                            Foreground="White"
                            Text="{Binding MaxLines}" />
                    </DockPanel>
    
                </Grid>
            </DockPanel>
        </Grid>
    </Window>
    Ответ написан
    Комментировать
  • Изучил C#, написал пару своих проектов. Стоит ли переходить на С++?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Я думаю, что просто изучить C# - этого мало. Нужно научиться писать сопровождаемый/поддерживаемый и тестируемый код. Научиться придерживаться какого-то адекватного стиля при написании кода, держать проект в чистоте и порядке, чтобы смотреть на него было не противно. Научиться строить более-менее грамотно архитектуру приложения. Научиться писать нормальный рабочий многопоточный код (а здесь нужны знания не только C#). Алгоритмы там и т.д. Просто знать язык и написать пару программ - этого мало. С++ можно изучить для общего развития и в целом это пригодится, так как иной раз нужно что-то написать на С++ и использовать в C#. В целом для понимания С++ кода.

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

    Скажу так, если алгоритмы всех своих программ, например, с UI, пишешь в MainWindow.cs или Form1.cs, то на С++ пока переходить не стоит, если хочется быть хорошим программистом, я бы развивался пока в C#. Книги бы почитал.

    Ещё я бы на твоём месте попробовал F#, вот там мозг в первые несколько часов/дней будет поломан из-за объёма непривычных конструкций, но язык крут.
    Ответ написан
    Комментировать
  • Visual Studio 2019 Community - коммерция?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Можно писать коммерческий софт. Исходники выкладывать не нужно.

    По ссылке Visual Studio Community написано

    Использование программы
    Для индивидуальных пользователей
    Любой индивидуальный разработчик может создавать бесплатные или платные приложения с помощью Visual Studio Community.
    Ответ написан
    Комментировать
  • Как понять что в объект была добавлена информация, но не изменена существующая?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Если нужно бросать исключение (я бы бросал). С массивами ты ничего не сделаешь, чтобы нельзя было менять часть массива. Нужно использовать свой тип данных вместо массива, в котором и делать проверки.
    using System;
    
    namespace ConsoleApp1
    {
        public class ModelBase
        {
            protected bool CheckValueTypeField<T>(T field)
                where T : struct
            {
                return field.Equals(default(T));
            }
    
            protected bool CheckReferenceTypeField<T>(T field)
                where T : class
            {
                return field == null;
            }
    
            protected void ThrowIfNotDefault<T>(T field)
                where T : struct
            {
                if (!CheckValueTypeField(field))
                {
                    throw new InvalidOperationException();
                }
            }
    
            protected void ThrowIfNotNull<T>(T field)
                where T : class
            {
                if (!CheckReferenceTypeField(field))
                {
                    throw new InvalidOperationException();
                }
            }
        }
    
        public class TestModel : ModelBase
        {
            private string _name;
            private int _value;
    
            public string Name
            {
                get { return _name; }
                set
                {
                    ThrowIfNotNull(_name);
                    _name = value;
                }
            }
    
            public int Value
            {
                get { return _value; }
                set
                {
                    ThrowIfNotDefault(_value);
                    _value = value;
                }
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                var test = new TestModel();
                test.Name = "test name";
                test.Value = 1;
    
                try
                {
                    test.Name = "new name";
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
    
                try
                {
                    test.Value = 5;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
    
                Display(test);
            }
    
            static void Display(TestModel model)
            {
                Console.WriteLine(
                    $"{nameof(model.Name)} == {model.Name}; {nameof(model.Value)} == {model.Value};");
            }
        }
    }


    Можно, конечно, и так, но игнорировать изменения и никого об этом не уведомлять так себе затея.
    public class TestModel : ModelBase
        {
            private string _name;
            private int _value;
    
            public string Name
            {
                get { return _name; }
                set
                {
                    if (!CheckReferenceTypeField(_name))
                    {
                        _name = value;
                    }
                }
            }
    
            public int Value
            {
                get { return _value; }
                set
                {
                    if (!CheckValueTypeField(_value))
                    {
                        _value = value;
                    }
                }
            }
        }


    Или такой вариант, пока не определился с поведением, как определишься, можно удалить параметр из конструктора и часть поведения.
    using System;
    
    namespace ConsoleApp1
    {
        public abstract class ModelBase
        {
            private readonly bool _throwAnExceptionInsteadOfAnEvent;
    
            public event EventHandler FieldIsNotDefault;
    
            protected ModelBase(bool throwAnExceptionInsteadOfAnEvent = true)
            {
                _throwAnExceptionInsteadOfAnEvent = throwAnExceptionInsteadOfAnEvent;
            }
    
            protected bool CheckValueTypeField<T>(T field)
                where T : struct
            {
                return field.Equals(default(T));
            }
    
            protected bool CheckReferenceTypeField<T>(T field)
                where T : class
            {
                return field == null;
            }
    
            protected void AssertIsNotDefault<T>(T field)
                where T : struct
            {
                if (!CheckValueTypeField(field))
                {
                    if (_throwAnExceptionInsteadOfAnEvent)
                    {
                        throw new InvalidOperationException();
                    }
    
                    OnFieldIsNotDefault();
                }
            }
    
            protected void AssertIsNotNull<T>(T field)
                where T : class
            {
                if (!CheckReferenceTypeField(field))
                {
                    if (_throwAnExceptionInsteadOfAnEvent)
                    {
                        throw new InvalidOperationException();
                    }
    
                    OnFieldIsNotDefault();
                }
            }
    
            protected void OnFieldIsNotDefault()
            {
                FieldIsNotDefault?.Invoke(this, EventArgs.Empty);
            }
        }
    
        public class TestModel : ModelBase
        {
            private string _name;
            private int _value;
    
            public string Name
            {
                get { return _name; }
                set
                {
                    AssertIsNotNull(_name);
                    _name = value;
    
                }
            }
    
            public int Value
            {
                get { return _value; }
                set
                {
                    AssertIsNotDefault(_value);
                    _value = value;
                }
            }
    
            public TestModel()
                : base(false)
            {
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                var test = new TestModel();
                test.FieldIsNotDefault += OnFieldIsNotDefault;
                test.Name = "test name";
                test.Value = 1;
    
                try
                {
                    test.Name = "new name";
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
    
                try
                {
                    test.Value = 5;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
    
                test.FieldIsNotDefault -= OnFieldIsNotDefault;
                Display(test);
            }
    
            private static void OnFieldIsNotDefault(object sender, EventArgs e)
            {
                Console.WriteLine("Поле уже установлено");
            }
    
            static void Display(TestModel model)
            {
                Console.WriteLine(
                    $"{nameof(model.Name)} == {model.Name}; {nameof(model.Value)} == {model.Value};");
            }
        }
    }
    Ответ написан
    Комментировать
  • Купил я лицензию на Resharper на год. Через 3 года я смогу продлить лицензию?

    Casper-SC
    @Casper-SC Автор вопроса
    Программист (.NET)
    Техподдержка мне ответила, что: например, купил я лицензию, и текущая версия 2017.3 у какого-то продукта. Через год вышел продукт версии 2018.1, если я не продлил лицензию, то моя версия на всегда остаётся 2017.3. Могу не пользоваться их продуктами несколько лет, а потом просто оплатить лицензию и всё вышеописанное повторяется.
    Ответ написан
    Комментировать
  • Использовать var или объявлять тип явно?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    var можно писать, там где явно видно, что за тип у этой переменной.

    Не хочется создавать длинное объявление, где дублируется название класса
    var sync = new SynchronizationContext();

    Видно сразу какой тип в переменной
    var data = (SomeType[])context;

    Linq
    var filtered = data.Where(...);

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

    Зачем вместо int писать var. Это вообще ни в какие ворота.

    В решарпере далеко не все правила по дефолту нужно считать единственно верными. Их можно отключать.
    Ответ написан
    Комментировать
  • Не работает скрипт PowerShell. В чём ошибка?

    Casper-SC
    @Casper-SC Автор вопроса
    Программист (.NET)
    Старый текст
    В общем, вот как правильно получить размер файла, а не длину строки в символах, которую я получал.
    Это я добавил позже, когда я разобрался в чём дело
    В Visual Studio Code уже определена переменная $file в конфигурации из-за чего у меня неправильно отображался вывод. Не размер файла в байтах, а длина строки. Подробнее в комментариях к этому сообщению.

    Опять старый, но правильный текст
    Берём просто класс из .NET System.IO.File и вызываем у него метод ReadAllBytes, далее мы имеем массив байт, у которого есть свойство Length, собственно, это свойство возвращает кол-во элементов в массиве, так как один элемент это значение типа System.Byte, то значит мы получаем кол-во байт. Если знаешь C#, то PowerShell будет в разы проще понять и использовать.

    Кстати, оговорюсь. Этот пример явно не самый гениальный вариант, ибо читать в память файл для получения его размера... Как прмер сойдёт.
    #Clear-Host
    
    $pathToFile = Get-Item C:\Windows\explorer.exe
    $bytes = [System.IO.File]::ReadAllBytes($pathToFile)
    "Размер файла $pathToFile составляет $($bytes.Length) байт"
    "Размер: {0:n3} мегабайт" -f $($bytes.Length / 1mb)


    Вариант 2. Создаём экземпляр класса System.IO.FileInfo и читаем значение свойства Length
    $pathToFile = Get-Item C:\Windows\explorer.exe
    $fileInfo = [System.IO.FileInfo]::new($pathToFile);
    "Размер файла $pathToFile составляет $($fileInfo.Length) байт"
    "Размер: {0:n3} мегабайт" -f $($fileInfo.Length / 1mb)
    Ответ написан
  • Visual Studio 2017 v15.3.5 не видит тесты xUnit в проекте ASP.NET Core 2.0. Как сделать, чтобы видела?

    Casper-SC
    @Casper-SC Автор вопроса
    Программист (.NET)
    Разобрался. В общем, для Visual Studio 2017 v15.3.5 у меня заработало всё с таким конфигом:
    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <TargetFramework>netcoreapp2.0</TargetFramework>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0-preview-20170914-09" />
        <PackageReference Include="xunit" Version="2.3.0-beta5-build3769" />
        <PackageReference Include="xunit.runner.visualstudio" Version="2.3.0-beta5-build3769" />
      </ItemGroup>
    
      <ItemGroup>
        <ProjectReference Include="..\..\src\RazorLesson.Model\RazorLesson.Model.csproj" />
      </ItemGroup>
    
    </Project>


    https://www.nuget.org/packages/Microsoft.NET.Test....
    https://www.nuget.org/packages/xunit/2.3.0-beta5-b...
    https://www.nuget.org/packages/xunit.runner.visual...

    https://docs.microsoft.com/en-us/dotnet/core/testi...
    Ответ написан
    Комментировать
  • Есть ли значительные отличия версий .NET Core v1 от .NET Core v2?

    Casper-SC
    @Casper-SC Автор вопроса
    Программист (.NET)
    Нашёл на английском языке: What's new in ASP.NET Core 2.0

    Кстати, нашёл очень полезную информацию не только по .NET Core (он тоже есть там)
    Документация по .NET (часть информации на русском ...
    Ответ написан
    Комментировать
  • Как называется событие переворачивания экрана на телефоне?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    PontyDetected
    Ответ написан
    Комментировать
  • Выполнение DML запроса после DDL. Как это провернуть?

    Casper-SC
    @Casper-SC Автор вопроса
    Программист (.NET)
    Оказалось, что проблема была в том, что весь вышеприведённый код выполнялся после изменения хранимой процеруды (ALTER PROCEDURE), и после кода этого самого изменения не стоял оператор GO. Вот и вся проблема, а так код рабочий.
    Ответ написан
    Комментировать
  • Как запустив программу через командную строку получить её Exit Code?

    Casper-SC
    @Casper-SC Автор вопроса
    Программист (.NET)
    Для Linux:
    using System;
    using System.Diagnostics;
    using System.IO;
    
    namespace Test
    {
    	class MainClass
    	{
    		public static void Main (string[] args)
    		{          
    			string result = LinuxTerminal.GetOutput("find /sys/class/input -maxdepth 1  -name \"mouse*\"|wc -l");
    			int outputValue = int.Parse (result);
    			Console.WriteLine (outputValue);
    			Console.ReadKey ();
    		}
    	}
    }


    using System;
    using System.Diagnostics;
    
    namespace Test
    {
    	public static class LinuxTerminal
    	{
    		private const string TerminalPath = "/bin/bash";
    
    		public static void ExecuteCommand(string command)
    		{
    			var proc = new Process();
    			proc.StartInfo.FileName = TerminalPath;
    			proc.StartInfo.Arguments = "-c \" " + command + " \"";
    			proc.StartInfo.UseShellExecute = false;
    			proc.Start();
    		}
    
    		public static int GetExitCode(string command)
    		{
    			var proc = new Process();
    			proc.StartInfo.FileName = TerminalPath;
    			proc.StartInfo.Arguments = "-c \" " + command + " \"";
    			proc.StartInfo.UseShellExecute = false;
    			proc.StartInfo.RedirectStandardOutput = true;
    			proc.Start();
    			proc.WaitForExit();
    			return proc.ExitCode;
    		}
    
    		public static string GetOutput(string command)
    		{
    			var proc = new Process();
    			proc.StartInfo.FileName = TerminalPath;
    			proc.StartInfo.Arguments = "-c \" " + command + " \"";
    			proc.StartInfo.UseShellExecute = false;
    			proc.StartInfo.RedirectStandardOutput = true;
    			proc.Start();
    			proc.WaitForExit();
    			return proc.StandardOutput.ReadToEnd();
    		}
    	}
    }


    Из под винды так работает запуск программы и получение ExitCode
    using System.Diagnostics;
    
    namespace ProcessStart
    {
        public static class CommandLine
        {
            public static int ExecuteCommand(string applicationPath, string command = "")
            {
                var proc = new Process();
                proc.StartInfo.FileName = applicationPath;
                proc.StartInfo.Arguments = command;
                proc.StartInfo.UseShellExecute = false;
                proc.StartInfo.CreateNoWindow = true;
                proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                proc.Start();
                proc.WaitForExit();
                return proc.ExitCode;
            }
        }
    }


    using System;
    using System.IO;
    
    namespace ProcessStart
    {
        class Program
        {
            private static Program _program;
    
            static void Main(string[] args)
            {
                _program = new Program();
                _program.Run();
            }
    
            private void Run()
            {
                const string ProgramName = "ReturnRandomNumber.exe";
                string appName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ProgramName);
    
                int exitCode = CommandLine.ExecuteCommand(appName); 
                Console.WriteLine(exitCode.ToString());
    
                Console.ReadKey();
            }
        }
    }
    Ответ написан
    Комментировать
  • Опасно ли выполнять такой код в С# + T-SQL? Или каким способом можно написать по-другому?

    Casper-SC
    @Casper-SC Автор вопроса
    Программист (.NET)
    В итоге решил это дело так. На место {0} в C# коде подставляется сгенерированный GUID

    BEGIN TRANSACTION
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    
    SET DEADLOCK_PRIORITY LOW;
    DECLARE @Quantity INT = 5;
    
    IF OBJECT_ID('tempdb..##GroupIDs_{0}') IS NULL
    BEGIN
    	CREATE TABLE ##GroupIDs_{0} (
    		ID INT NOT NULL,
    		CONSTRAINT PK_GroupIDs_ID_{0} PRIMARY KEY(ID),
    	);
    END
    
    INSERT INTO ##GroupIDs_{0} (ID) 
    SELECT TOP(@Quantity) ID FROM SOME_GROUP WITH(UPDLOCK, READPAST) WHERE REPLICATED <> 1
    
    -- Первый запрос, вызываемый из C# кода в одной транзакции.
    -- 1 ------------------------------------------------------------------
    UPDATE SOME_GROUP SET REPLICATED = 2 
    OUTPUT 
      INSERTED.ID
     ,INSERTED.NAME
    WHERE ID IN(SELECT ID FROM ##GroupIDs_{0})
    
    -- Второй запрос, вызываемый из C# кода в одной транзакции.
    -- 2------------------------------------------------------------------
    UPDATE SOME_CHILD_ONE SET REPLICATED = 2 
    OUTPUT 
      INSERTED.ID
     ,INSERTED.GROUP_ID
     ,INSERTED.UPDATED
    WHERE GROUP_ID IN(SELECT ID FROM ##GroupIDs_{0}) AND REPLICATED <> 1
    
    -- Третий запрос, вызываемый из C# кода в одной транзакции.
    -- 3 ------------------------------------------------------------------
    UPDATE SOME_CHILD_TWO SET REPLICATED = 2 
    OUTPUT 
      INSERTED.ID
     ,INSERTED.GROUP_ID
     ,INSERTED.NAME
     ,INSERTED.CREATED
    WHERE GROUP_ID IN(SELECT ID FROM ##GroupIDs_{0}) AND REPLICATED <> 1
    
    DROP TABLE ##GroupIDs_{0};
    -- 3 ------------------------------------------------------------------
    
    COMMIT TRANSACTION
    Ответ написан
    Комментировать
  • Как лучше изучать C#?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    ITVDN - C# вот тут очень хорошие курсы, я базовый шарп не смотрел, учил по Шилдту и писал прогу. А вот на ITVDN я уже посмотрел курс C# для профессионалов. Толк от этого очень даже был.
    Ответ написан
    3 комментария
  • C#. Операторы доступа для сокрытия, но не для защиты?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    В каком энтерпрайзе? Это как рассуждение, что одежда нужна лишь для показухи и чтобы прилично выглядеть среди людей, детей и т.д., а дома можно ходить и голым. Так же можно придраться к любому принципу программирования. Вот забьёшь ты на всё это, тебя самого не будет парить, что у тебя в привычку входит быдлокодить? Следовательно у тебя не развивается определённый навык, ведь ты не паришься о сокрытии. Да и сам ты через месяца разберёшься в своём большом проекте, что можно вызывать из вне, что нет.

    А зачем вообще классы? Давай всё в один класс, но у каждого метода будет префикс, чтобы понятно было, а то ещё точку ставить надо. Вот ещё!
    Ответ написан
    3 комментария
  • С чего начать программирование?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Учи C#. Плюсы конкретно для тебя (возраст):
    1. Море инфы на русском языке и почти вся справка.
    2. Удобнейшая среда разработки и тоже есть на русском языке. При том есть такая фишка, как XML документирование кода. Наводишь курсор мыши на метод в коде или класс, например, и читаешь его описание на русском языке. Это сильно ускорит твоё обучение. При том это реально крутой язык. Очень сильно похож на Java.
    3. Море видеокурсов на русском языке, при том есть очень вменяемые (гугли ITVDN).

    Один из адекватнейших и бесплатных курсов
    Читать:
    1. Герберт Шилдт. Полный справочник по C#.
    2. CLR via C# - Программирование на платформе Microsoft.NET Framework 4.5 на языке C#.
    И так же есть море книг уже по конкретным технологиям языка:
    - ADO.NET и в дополнение Entity Framework (Работа с базами данных).
    - WPF (пользовательский интерфейс, при том одна из удобнейших технологий с серьёзными возможностями).
    - Windows Forms (пользовательский интерфейс).
    - ASP.NET (разработка веб приложений, сайтов).
    - WCF (удобное сетевое программирование, если вкратце, а так можно по старинке на сокетах всё делать).
    - Что-то я определённое не упомянул...
    Скачать Visual Studio 2015 Community Edition
    Ответ написан