Задать вопрос
  • JavaScript и скачивание файла с ASP.NET Core WebAPI сервера. Почему файл скачивается как повреждённый?

    Casper-SC
    @Casper-SC Автор вопроса
    Программист (.NET)
    Проблема была в том, что в axios не передавался параметр responseType: 'blob',.

    getReport(dateFrom, dateTo) {
            return axios.post(this.config.getReportUrl, {
                from: dateFrom,
                to: dateTo
            }, {
                baseURL: this.config.baseUrl,
                withCredentials: true,
                responseType: 'blob',
                headers: {
                    "Accept": "*/*",
                    "Cache-Control": "no-cache",
                }
            });
        };
    Ответ написан
    Комментировать
  • 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 комментария