20.11.2017 Распечатка данных
 
Привет!

Нужно распечатать данные из БД в С# (WinForm) программе на принтере.

Смотрю сейчас на PrintDocument, PrintDialog etc. Или есть другие удобные вещи?
Хотелось бы узнать кто чем пользуется.

19.11.2017 Почему 0?
 
class Program
    {
        static void Main(string[] args)
        {
            int[] arr = new int[] { 1, 2, 3 };

            int num = 1;

            var st = arr.Where(x => x > num);

            num = 3;

            st = st.Where(x => x < num);

            Console.WriteLine(st.Count().ToString());

            Console.ReadKey();

        }
    }


Почему на консоль выводится 0? Объясните подробно, плз.

19.11.2017 Минимальный EXE на .NET Core 2.0.
 
Собрал консольное приложение под .NET Core 2.0

Получил на выходе app.dll

Как его запустить понятно — "dotnet app.dll"

Копирую app.dll в папку, которая перечислена в системной переменной PATH

Запускаю dotnet app.dll — выдает ошибку "модуль не найден"

Ладно. Покурил вопрос генерации exe
dotnet publish --self-contained -r win10-x64 -c Release -o binx App.sln

Получил папку binx и 218 файлов, общим размером размером 67MB. App.exe там есть. И он работает.

В принципе, можно добавить в PATH путь к этой папке и успокоиться.

Но меня терзает вопрос — это вообще нормально?

Есть способ получить exe с минимальной обвязкой?

17.11.2017 Узнать TargetFramework для сборок под FW3.5
 
Общая задача описана здесь
Автор: Коваленко Дмитрий
Дата: 16.11 13:50
— хочу замутить хранилище сборок.

Хочу программно узнать под какую версию Framework откомпилирована сборка. Пишу под FW4.6.2

Эти данные хранятся в атрибуте TargetFramework.

Но этот атрибут отсутствует в сборках, откомилированных под FW3.5.

В тоже время, "JetBrain dotPeak" показывает для этих сборок сведения о платформе. И показывает правильно — ".Net Framework v3.5"

Есть предположения — как он получает эти данные?

UPD. В файлах с ресурсами (для FW4+) TargetFramework тоже отсутствует и "JetBrain dotPeak" всегда говорит, что они для ".Net Framework v4.0".

16.11.2017 Протокол удаленного взаимодействия
 
Вот есть SOAP, есть REST. Почему то везде сделан акцент на человекочитаемость. Но зачем? Ведь без утилит ни XML ни JSON все равно читать не удобно. А с утилитами можно читать все что угодно.

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

15.11.2017 Генерация графиков в Ажуре
 
Подскажите библиотеку генерации графиков (в виде изображений), чтобы работала в песочнице Ажура (нет доступа к GDI/GDI+). Пока использую контролы Telerik для WPF, но вдруг есть что-то лучше.

Нужна поддержка двух вертикальных осей и множества серий данных на одном графике.

14.11.2017 .NET Core 2.0 на армах
 
Попробовал на 32-х битной ARM запустить что нибудь на .net core в линуксе — прекрасно запускается после такой сборки:
dotnet publish -r linux-arm -c Release


Искал как на ARM64, точнее aarch64 в линуксе запустить — а фиг вам. 64-битный линукс не умеет 32-х битный бинарник запускать чего то.
Есть поддержка ARM64 только для WIN10 — это лобби виндовое так успешно поработало?

О том что летом таки сделали поддержку arm32 случайно узнал из этого докер-файла

За что выкинули не сделали поддержку arm64 на линуксе?

И почему тут нет упоминания linux на arm32, на котром dotnet прекрасно работает:
https://github.com/dotnet/core/blob/master/release-notes/2.0/2.0-supported-os.md

ВВОБЩЕ ФИГ НАЙДЕШ КАКОЕТО упоминание про core 2.0 на arm, кроме докер-хаба выше.

Завтра в core 2.1 выкинут linux-arm (32-бит) рантайм или оставят?

13.11.2017 Минутка WTF-21: Как в аптеке
 
Как обычно
Автор: Sinix
Дата: 06.11 19:08
:
public static TimeSpan GetScaledTime(this TimeSpan value, double multiplier) =>
    TimeSpan.FromMilliseconds(value.TotalMilliseconds * multiplier);

Ну и где тут можно ошибиться?

10.11.2017 юнит тесты на F# в VS2015
 
Доброго дня!
Коллеги, кто знает подскажите простой способ делать и запускать юнит-тесты в F# проекте в VS2015?..

Я добавил в солюшен отдельный F# проект (типа library), затем в него пакет NUnit, однако штатный студийный обозреватель тестов не видит эти тесты. wtf?
Попробывал FsCheck — однако и его тесты не видны...

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


PS. надо именно F#, C# не нужен, там нет паттерн-матчинга .

07.11.2017 [Интервью] .NET Security — это просто
 
В предверии столичной DotNext 2017, я и Михаил Yuske Щербаков дали небольшое интервью её организаторам по вопросам безопасности платформы .NET и разрабатываемых под неё приложений.

https://habrahabr.ru/company/jugru/blog/341792/
... << RSDN@Home 1.3.16 alpha 5 rev. 60>>

06.11.2017 Минутка WTF-20: Меньше кода - меньше ошибок
 
Давно не виделись
Автор: Sinix
Дата: 28.02.17
, угу.

Буду краток.
        // c# 7.1
        static bool IsDefault<T>(T value) => Equals(value, default);

        static void Main(string[] args)
        {
            Console.WriteLine(IsDefault(0));
            Console.ReadKey();
        }


Вопрос стандартный: что не так-то?

06.11.2017 .Net Core и COM
 
Замутил тестовый проект под .Net Core (NETCOREAPP2_0), создающий COM-объект.

Получаю ошибку вызова CoCreateInstance — 0x800401F0 (CO_E_NOTINITIALIZED — CoInitialize has not been called).

Указание атрибута [MTAThread] не помогает.

[MTAThread]
static void Main(string[] args)

Подскажите — как заставить Core инициализировать COM?

Ну, кроме кроме явного вызова CoInitialize, конечно.

05.11.2017 Azure App Service и SQL Server Express
 
Вот задеплоил я веб-приложение на Azure App Service и смотрю параметры его рабочего окружения в Kudu:

Connection Strings

LocalSqlServer
ConnectionString = data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true
ProviderName = System.Data.SqlClient


То есть, приложению в его рабочем окружении доступна копия SQL Server Express. Могу ли я использовать эту строку подключения в приложении и писать данные в aspnetdb.mdf прямо в облаке? Или это только доступ для чтения? Если писать туда можно, есть гарантия что данные там не исчезнут при новых деплоях?

02.11.2017 Как протестировать сборку под .NET Standard v2?
 
Пытаюсь перетащить свою библиотеку на .NET Standard v2 [VS2017]

Вроде все скомпилировалось, но не получается подсунуть тесты под NUnit.

Я так понимаю, что я не понимаю .NET Standard...

По порядку:

1. Поставил ".NET Core cross-platform development" в VS
2. Пересобрал модули
  Проектные файлы выглядят как-то так
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <EnableDefaultItems>false</EnableDefaultItems>
    <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  </PropertyGroup>

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <RootNamespace>lcpi_lib_tests</RootNamespace>
    <Prefer32Bit>false</Prefer32Bit>
    <OutputPath>bin\vs2017_nets2.0_$(Configuration)\</OutputPath>
    <IntermediateOutputPath>obj\vs2017_nets2.0_$(Configuration)\</IntermediateOutputPath>
    <KeyContainerName>lcpi.net.code.keys</KeyContainerName>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <AssemblyName>lcpi.lib.ntest.nets2_0.debug</AssemblyName>
    <DefineConstants>DEBUG;BUILD_CONF__NETSTANDARD2_0</DefineConstants>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <AssemblyName>lcpi.lib.ntest.nets2_0</AssemblyName>
    <DefineConstants>BUILD_CONF__NETSTANDARD2_0</DefineConstants>
  </PropertyGroup>
....

К проекту с NUnit тестами была добавлена ссылка на nunit.framework.dll (2.6.2) — она нормально работала с тестами откомпилированными для FW 4.6.2

3. В выходном каталоге сформировались следующие файлы:
lcpi.lib.nets2_0.debug.dll <---- это библиотека, которую надо протестировать
lcpi.lib.nets2_0.debug.pdb
lcpi.lib.ntest.nets2_0.debug.deps.json
lcpi.lib.ntest.nets2_0.debug.dll <----- Это тесты
lcpi.lib.ntest.nets2_0.debug.pdb
nunit.framework.dll
nunit.framework.xml


4. Запускаю nunit.exe (2.6.2) для сборки с тестами и получаю ошибку

---------------------------
NUnit
---------------------------
Test load failed!

System.IO.FileNotFoundException : Не удалось загрузить файл или сборку "netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" либо одну из их зависимостей. Не удается найти указанный файл.

For further information, use the Exception Details menu item.
---------------------------
ОК
---------------------------


Поиск по системному диску выдал такой список:
C:\Program Files\dotnet\sdk\NuGetFallbackFolder\netstandard.library\2.0.0\build\netstandard2.0\ref\netstandard.dll
C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.netcore.app\2.0.0\ref\netcoreapp2.0\netstandard.dll
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\netstandard.dll
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\ref\netstandard.dll
C:\Users\Dima\.nuget\packages\runtime.win-x86.microsoft.netcore.app\2.0.0\runtimes\win-x86\lib\netcoreapp2.0\netstandard.dll
C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.0\netstandard.dll
C:\Program Files\dotnet\sdk\2.0.2\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\netstandard.dll
C:\Program Files\dotnet\sdk\2.0.2\Microsoft\Microsoft.NET.Build.Extensions\net461\ref\netstandard.dll


Вопрос — что нужно сделать, что nunit.exe смог загрузить мою сборку. То есть, чтобы он нашел эту netstandard.dll?

Спасибо.

01.11.2017 На чем в MS пишут кроссплатформенные приложения?
 
Привет всем,
Собственно САБЖ, например Azure Storage Explorer он доступен для Win, Mac, Linux.
Вроде как не на .Net.

31.10.2017 Ролики по Nitra - средству разработки языков программирования
 
Решил начать снимать ролики демонстрирующие возможности Nitra, объясняющие ее устройство и рассказывающие как с ее помощью делать языки программирования (в том числе и Расширяемые вроде Nemerle).

Так как Nitra пока что живет только на .Net-е решил, что здешним посетителям будет это интересно.

Буду выкладывать эти ролики сюда.

Так же просьба ретвитеть ролики на (твит с первым роликом ). И вообще любая помощь в распространении приветствуется! Так же подписывайтесь на этот твиттер и мой канал Nitra на youtube-е. Нам очень нужна поддержка потенциальных пользователей и просто заинтересованных людей!

Если кто-то заинтересован в теме (есть интерес в самой Нитре, интересна разработка ЯП или DSL-ей) просьба обращаться на Скапй vc.rsdn.ru или мыло vlad@rsdn.ru. Не скрою, нам нужна и финансовая поддержка, так как разработка for fun такого большого и сложного проекта идет со скрипом. Если у кого-то есть какие-то мысли или предложения, пишите сюда или в личку (скайп/почту).

Первый ролик посвящен плагину к IDE над которым я сейчас работаю. Точнее генератору плагинов, которые автоматически генерирует плагины к языкам описанным на Nitra. https://github.com/rsdn/nitra.

https://www.youtube.com/watch?v=tDwf7zHREvY

30.10.2017 [xUnit] Переправить Debug.WriteLine() в ITestOutputHelper
 
Хочется весь Debug.WriteLine переправлять в оутпут xUnit.

Посмотрел сюда https://xunit.github.io/docs/capturing-output.html и наколхозил класс DebugOutputAdapter:

    public class FirstTest
    {
        public FirstTest(ITestOutputHelper output)
        {
            DebugOutputAdapter.Bind(output);
        }

        [Fact]
        public void PassingTest()
        {
            Debug.WriteLine("Line 1: " + DateTime.Now);
            Thread.Sleep(4000);
            Debug.WriteLine("Line 2: " + DateTime.Now);
            Assert.Equal(4, Add(2, 2));
        }

        [Theory]
        [InlineData(3)]
        [InlineData(5)]
        [InlineData(6)]
        public void MyFirstTheory(int value)
        {
            Debug.WriteLine("Check theory using " + value);
            Assert.True(IsOdd(value));
        }

        bool IsOdd(int value)
        {
            return value % 2 == 1;
        }
    }

На удивление Resharper "плавно" показывает output в PassingTest. То есть сразу показывает

Line 1: 10/30/2017 1:25:17 PM


потом ждет 4 секунды и показывает

Line 2: 10/30/2017 1:25:21 PM


Вопрос. Как не писать в каждом-каждом тест-классе такой как выше конструктор?
        public Имя_Тест_Класса(ITestOutputHelper output)
        {
            DebugOutputAdapter.Bind(output);
        }


P.S. Понятно выполнение тестов надо сериализовывать что бы output не перемешивался.

P.P.S. и ещё вопрос — xUnit сортирует ли имена классов и методов при сериализации выполнения как и NUnit консольные и решарперовские раннеры?

  Сам банальный класс DebugOutputAdapter
    class DebugOutputAdapter
    {
        static ITestOutputHelper CurrentOutput = null;

        static DebugOutputAdapter()
        {
            Debug.Listeners.Add(new MyTraceListener());
        }

        public static void Bind(ITestOutputHelper output)
        {
            CurrentOutput = output;
        }

        class MyTraceListener : TraceListener
        {
            public override void Write(string message)
            {
            }

            public override void WriteLine(string message)
            {
                if (CurrentOutput != null)
                    CurrentOutput.WriteLine(message);
            }
        }
    }

27.10.2017 Можно ли поменять атрибут у метода интерфейса?
 
Всем привет!

От стороннего сервиса приходит WSDL, из которой студия генерит что-то вроде следующего:
public interface IMyInterface {        
        
// CODEGEN: Generating message contract since the operation MyMethod is neither RPC nor document wrapped.
[System.ServiceModel.OperationContractAttribute(Action="http://failUrl/request", ReplyAction="http://failUrl/response")]
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
Response MyMethod(Request request);

Это совершенно не рабочий вариант
Рабочий такой:
[System.ServiceModel.OperationContractAttribute(Action="http://www.service.com/SDFSDF", ReplyAction="*")]

Можно ли поменять значения у атрибута?
Если в дизайн-тайме не получится, то хотя бы в рантайме
В самом крайнем случае — в бехавиоре, но пока непонятно в каком
Спасибо...

27.10.2017 Сложное (многоклассовое) наследование и полиморфизм - возможно или нет?
 
Сложное (многоклассовое) наследование и полиморфизм — возможно или нет?

Когда я сталкивался ранее с наследованием классов и полиморфизмом, то это было или,

1) дописывание каких то новых методов в класс-потомок, которых не было в классе-предка. (обычное наследование).
2) переопределение некоторых методов, объявленных в базовом классе как virtual, (обычный полиморфизм), причем сигнатурна методов оставалась одинаковой.

А можно ли унаследовать сразу множество связанных классов? Т.е. как бы целый проект из связных классов, унаследуется от базового проекта, тех же классов,
каждый в своем множестве унаследован от класса-прототипа в базовом проекте.
Чтобы было понятнее, что имеется в виду, 1) упростим задачу до предела — множество из 2-х классов, должно унаследоваться от другого множества из 2-х классов.
(на практике, если есть такая возможность с двумя, то можно хоть 10, хоть 100, хоть любое количество классов в множестве унаследовать).
2) напишу на псевдо-C# языке, чтобы было понятнее, что имею в виду.


Допустим, ранее был написан некий проект с названием Module, который для простоты, состоит из 2-х классов.
Позже, нам нужно эти два класса унаследовать в проекте Special, который как бы, расширяет возможности Module-проекта.

//------------------------------

// Получается, в простейшем варианте, проект Module, допустим, состоял из двух работоспособных классов.


public class ModuleEntity // некая сущность в базовом проекте Module
{
public int ab;
public int cd; // некие поля описывающие сущность
}



public class ModuleAlgorithmic // некая сущность в базовом проекте Module
{
public ModuleEntity entity;

public virtual ModuleEntity[] AlgorithmOfModule(ModuleEntity param)
{
// ...
}
}



//------------------------------

// Как нужно унаследовать сразу два класса. В новом проекте Special.


public class SpecialEntity : ModuleEntity // некая сущность в базовом проекте Module. Наследование этого класса понятно.
{
public int ef; // ну и понятно, будут доступны ab, cd от ModuleEntity
}

//------------------------------

А вот дальше, нам нужно унаследовать класс SpecialAlgorithmic от ModuleAlgorithmic, да так, чтобы 1) его единственное поле ModuleEntity entity;
просто стало полем унаследуемого типа, SpecialEntity entity; 2) Метод AlgorithmOfModule — нужно переопределить (override), да так, что
его сигнатура "почти такая же", но не совсем — этот метод должен уже принимать унаследуемые ссылки на SpecialEntity вместо ModuleEntity.
Т.е. как написать что то типа такого (привожу на псевдо-языке, но должно быть понятно, что имеется в виду).



public class SpecialAlgorithmic : ModuleAlgorithmic // некая сущность в базовом проекте Module
{
public SpecialEntity entity : override ModuleEntity entity; // override field from ModuleAlgorithmic class — field entity

public override SpecialEntity[] AlgorithmOfModule(SpecialEntity param) : ModuleEntity[] AlgorithmOfModule(ModuleEntity param)
{
// ...
}
}


//------------------------------


Что же в таком случае получается? Допустим у нас первый проект, с классами ModuleEntity, ModuleAlgorithmic — полностью работоспособный,
и выводит некий результат после


ModuleEntity param = new ModuleEntity( /* ... */ );
ModuleEntity modEnt = new ModuleEntity( /* параметры создающие объект */ );
ModuleAlgorithmic modAlg = new ModuleAlgorithmic(modEnt); // приняв modEnt, запишет в поле entity
ModuleEntity[] result = modAlg.AlgorithmOfModule(param) // где param — тоже ModuleEntity


// нам нужно получить точно такой же результат, если заменим в этом блоке из 4 строк, все "Module" на "Special"


SpecialEntity param = new SpecialEntity( /* ... */ );
SpecialEntity modEnt = new SpecialEntity( /* параметры создающие объект */ ); // здесь проблем нет — унаследовано и добавлено поле int ef;
SpecialAlgorithmic modAlg = new SpecialAlgorithmic(modEnt); // приняв modEnt, запишет в поле entity !! но уже в SpecialEntity entity : который override (не ModuleEntity типа)
SpecialEntity[] result = modAlg.AlgorithmOfModule(param) // где param — тоже ModuleEntity , но точнее — унаследуемый тип SpecialEntity от ModuleEntity


//------------------------------


Казалось бы, всё просто — унаследовали SpecialEntity от ModuleEntity, добавив ему поле (здесь проблем нет).
Второе — унаследовали SpecialAlgorithmic от ModuleAlgorithmic, чтобы в конечном итоге можно было вызвать точно такой же код, только заменив слова 'Module' на 'Special'.
Виртуальный метод AlgorithmOfModule будет тоже как надо, переопределен.

НО!! Вот загвоздка — 1) нужно то еще первое — переопределить его сигнатуру, т.е. чтобы метод принимал и возвращал объекты другого типа, пусть и унаследуемого!
2) поле лишнее entity — тоже создавать НЕ ВАРИАНТ — больше памяти будет занимать (допустим алгоритм имеет сильно упирается в память), а значит нужно переопределить
внутреннее ПОЛЕ.

Если кто понял, то подскажите, как средствами C# и .NET (а может и C++) — можно решить такую задачу "сложного многоклассового наследования" ?
Чтобы ни лишние поля в классе-обертке не создавать, и метод переопределить с унаследованной сигнатурой. Если это возможно, то целые проекты со многими
связными классами аналогично можно унаследовать, переопределив только нужную часть, а в вызывающем коде, нужно будет только заменить название-хидер проекта,
как у нас — заменяли 'Module' на 'Special'.
Какие нибудь "шаблоны проектирования" подобное позволяют?

Заранее, спасибо.

26.10.2017 DataContract-десериализация и порядок полей
 
Всем привет!

Есть ли способ избежать ошибок десериализации, если порядок элементов во входном XML не совпадает с ожидаемым?
Например:
<Auth>
    <ApiLogin>asasd<ApiLogin>
    <ApiPassword>456465<ApiPasword>
</Auth>

работает
а
<Auth>
    <ApiPassword>456465<ApiPasword>
    <ApiLogin>asasd<ApiLogin>
</Auth>

нет

сам класс на сервере
    [DataContract]
    internal class AuthInfo 
    {
        /// <summary>
        /// The api login
        /// </summary>
        [DataMember(IsRequired = true)]
        internal string ApiLogin;

        /// <summary>
        /// The api password
        /// </summary>
        [DataMember(IsRequired = true)]
        internal string ApiPassword;
    }


Зачем вообще нужна эта проверка по порядку?
Это же не значит, что названия элементов в XML могут быть любыми

PS. на клиенте в классе, сгенерированном из WSDL порядка полей нет (даже если их явно указать в исходном классе)