23.06.2018 EF + разные СУБД в одном проекте: вопрос миграции
 
В одном проекте используется несколько СУБД. Требуется добавить миграцию наименее гемморным способом. Т.е. для каждой СУБД будут свои файлы Migrations.

Можно указать папку Migrations в DbMigrationsConfiguration, но возникают проблемы (все равно ищет файл от чужой СУБД).

Как лучше сделать, при использовании EF?

21.06.2018 Можно ли генерировать Unsafe код в DynamicMethod?
 
Два дня гуглил — ничего не нагуглил.
Берём примитивный тестовый код:
        public static void Test()
        {
            unsafe
            {
                fixed (int* p = new int[1])
                {
                    *p = -1;
                }
            }
       }

Всё работает. Смотрим в ILDASM:
 .method /*06000013*/ public hidebysig static void 
    Test() cil managed 
  {
    .maxstack 2
    .locals /*1100000D*/ init (
      [0] int32* p,
      [1] int32[] pinned V_1
    )

    IL_0000: nop          

    IL_0001: nop          

    IL_0002: ldc.i4.1     
    IL_0003: newarr       [mscorlib/*23000001*/]System.Int32/*0100003F*/
    IL_0008: dup          
    IL_0009: stloc.1      // V_1
    IL_000a: brfalse.s    IL_0011
    IL_000c: ldloc.1      // V_1
    IL_000d: ldlen        
    IL_000e: conv.i4      
    IL_000f: brtrue.s     IL_0016
    IL_0011: ldc.i4.0     
    IL_0012: conv.u       
    IL_0013: stloc.0      // p
    IL_0014: br.s         IL_001f
    IL_0016: ldloc.1      // V_1
    IL_0017: ldc.i4.0     
    IL_0018: ldelema      [mscorlib/*23000001*/]System.Int32/*0100003F*/
    IL_001d: conv.u       
    IL_001e: stloc.0      // p

    IL_001f: nop          

    IL_0020: ldloc.0      // p
    IL_0021: ldc.i4.m1    
    IL_0022: stind.i4     

    IL_0023: nop          

    IL_0024: ldnull       
    IL_0025: stloc.1      // V_1

    IL_0026: nop          

    IL_0027: ret          

  } // end of method Program::Test

Ничего военного — основные приседания вокруг пиннинга массива и проверки, что он не null и длина больше нуля.
Пробуем воспроизвести:
        private static void GenerateTestMSIL(ILGenerator ilg)
        {
            var p = ilg.DeclareLocal(typeof(int*));
            var t = ilg.DeclareLocal(typeof(int[]), true);
            var zeroPtr = ilg.DefineLabel();
            var nonZeroPtr = ilg.DefineLabel();
            var main = ilg.DefineLabel();

            ilg.Emit(OpCodes.Ldc_I4_1);
            ilg.Emit(OpCodes.Newarr, typeof(int));
            //ilg.Emit(OpCodes.Dup);
            ilg.Emit(OpCodes.Stloc, t);
            //ilg.Emit(OpCodes.Brfalse, zeroPtr);//
            //ilg.Emit(OpCodes.Ldloc, t);
            //ilg.Emit(OpCodes.Ldlen);
            //ilg.Emit(OpCodes.Conv_I4);
            //ilg.Emit(OpCodes.Brtrue, nonZeroPtr);
            //ilg.MarkLabel(zeroPtr);
            //ilg.Emit(OpCodes.Ldc_I4_0);
            //ilg.Emit(OpCodes.Stloc, p);
            //ilg.Emit(OpCodes.Br_S, main);
            ilg.MarkLabel(nonZeroPtr);
            ilg.Emit(OpCodes.Ldloc, t);
            ilg.Emit(OpCodes.Ldc_I4_0);
            ilg.Emit(OpCodes.Ldelema, typeof(int));
            ilg.Emit(OpCodes.Conv_U);
            ilg.Emit(OpCodes.Stloc, p);
            ilg.MarkLabel(main);
            ilg.Emit(OpCodes.Ldloc, p);
            ilg.Emit(OpCodes.Ldc_I4_M1);
            ilg.Emit(OpCodes.Stind_I4);
            //ilg.Emit(OpCodes.Ldnull);
            //ilg.Emit(OpCodes.Stloc, t);
            ilg.Emit(OpCodes.Ret);
        }

(Закомментированы избыточные операции, которые C# вставляет из паранойи — их наличие, к сожалению, на работоспособность не влияет).
Вот теперь странности:
1. Если мы генерируем этот код в метод класса, созданного в рамках динамической сборки, то всё работает, как ожидается:
        public static Action GenerateTestAssembly()
        {
            var ab = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("FixedTest"), AssemblyBuilderAccess.Run);
            var tb = ab.DefineDynamicModule("FixedTest", "FixedTest.dll").DefineType("FixedTest", TypeAttributes.Class | TypeAttributes.Public);
            var mtb = tb.DefineMethod("Test", MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Static);

            GenerateTestMSIL(mtb.GetILGenerator());
            Type type = tb.CreateType();
            return (Action)type.GetMethod("Test").CreateDelegate(typeof(Action));
        }

А вот если мы попробуем такой же MSIL сгенерировать в рамках DynamicMethod, то попытка вызвать его приведёт к InvalidOperationException "This operation could destabilize the runtime".
В чём может быть дело?
Понятное дело, что PEVerify ругается на порождённый таким образом код, точно так же, как и на оригинальный метод Test(). Поэтому найти, что именно там could destabilize the runtime, не представляется возможным.

20.06.2018 Передать сертификат для подписи на сервере
 
Я в криптографии честно говоря по верхам, поэтому у меня вот такой такой дурацкий вопрос про ЭЦП и КЭП.
Допустим, есть сервер, которое готовит некий XML, который пользователь должен подписать.

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

В вебе насколько я понимаю для этих целей переносимого решения нет и все это проделывается при помощи разнообразных плагинов.

А вот может ли клиент/пользователь как-то выбрать сертификат и отправить его на сервер, чтобы сервер сам этим сертификатом подписал все что ему нужно? Реализуется ли это без плагинов? Понятно дело, что файл сертификата с закрытым ключом можно тупо отправить как файл в POST-запросе, но это уж совсем дурацкое решение.

20.06.2018 NET Core 2.0 will reach End of Life on September 1, 2018
 

.NET Core 2.0 was released on August 14, 2017. As a non-LTS release, it is supported for 3 months after the next release. .NET Core 2.1 was released on May 30th, 2018. As a result, .NET Core 2.0 will be supported until September 1, 2018.

After that time, .NET Core patch updates will no longer include updated packages of container images for .NET Core 2.0. You should plan your upgrade from .NET Core 2.0 to 2.1 now.


.NET Core 2.0 will reach End of Life on September 1, 2018
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>

20.06.2018 После переустановки Windows 7 dll не импортируется
 
Доброго дня.

Столкнулся с проблемой. Пытаюсь в C# импортировать библиотеку. Однако, она возвращает ошибку:

"Не удается загрузить DLL "Mydll": Не найден указанный модуль. (Исключение из HRESULT: 0x8007007E)"

Импорт делаю так:

        [DllImport(@"C:\Mydll.dll",
                   EntryPoint = "Method1",
                   CallingConvention = CallingConvention.Cdecl)]
         internal static extern int Method1();


Есть нюанс. Недавно на машине переустанавливали Windows (7) . До переустановки dll цеплялась. Теперь нет. На других машинах dll тоже цепляется. Подозреваю, дело в настройках Windows. Возможно в каких-то системных переменных?.. Кто-нибудь сталкивался с подобным? Можете что-то посоветовать?

Спасибо.

20.06.2018 Знак "?" после вызова метода
 
var value = node.ChildNodes.Descendants("div").FirstOrDefault(d => d.Attributes.Contains("class"))?.InnerHtml;

Что означает ? перед .InnerHtml?

19.06.2018 Удаляет ли GC скомпилированные лямбды?
 
Попался код который делает по многу MyFunc<T> myFunc = Expression.Lambda(typeof(Func...).Compile()

А я не знаю хорошо так делать или нехорошо я имею ввиду память оно в IL компилит или сразу в Native-Код.

И как его GC может чистить если это КОД...

19.06.2018 Как блокировать спящий режим из консольного приложения?
 
Всем привет!

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

Как это сделать в .NET (4.6.2)?
Спасибо...

18.06.2018 json вместо csproj
 
Зачем вообще это понадобилось, для чего?

Как сделать, чтобы VS по умолчанию делала project.json вместо csproj?

14.06.2018 Одинаковый бинарник при перекомпиляции
 
Можно ли сделать так, чтобы при компиляции одного и того же исходного кода бинарник был все время одинаковым (побитово)?

Ведь практическая применимость очень высокая — скомпилил OpenSource и все знают что ты скомпилил именно то, что завявлено. Несколько чел. проверят, получат тот же бинарник, сравнят хеш — и уже можно будет верить.

Сейчас же сделано так, что с каждой компиляцией бинарник все время разный, даже если вы ничего не меняли. Какой в этом смысл — не понятно.

13.06.2018 Вывод общего интерфейса - возможно ли?
 
Возможно ли реализовать подобное в C#/F# сейчас или в ближайшем будущем без использования dynamic?
var service = new StupidService()
.Smart()
.Useful();

ISmartService s1 = service;
IUsefulService s2 = service;


В случае Extension-методов возникает проблема написания кода для всех возможных комбинаций интерфейсов.

Вариант с рантайм-генерацией типов подходит, но возникает вопрос — каким должно быть возвращаемое значение? Как описать T + IInterface?

Почему не подходит контейнер — отсутствие проверок на этапе компиляции. Да, Resolve<IService> будет бросать исключения, если зависимости не были проинициализированы, но узнаем мы об этом только в рантайме.

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

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

11.06.2018 Склонение слов по падежам
 
Встречается ли в природе библиотека для склонения слов русского языка по падежам?

10.06.2018 Serial Port, unsafe и .net standard
 
Я правильно понимаю, что с ком портом ни .Net Standard ни .Net Core рабоать не позволяют?

Так же не совсем понятно: unsafe и структуры с выравниванием в .Net Standard использовать вроде бы можно.
А вызовы WinApi уже нет?

Мне хотелось бы код для работы с оборудованием и дисками вынести в библиотеку, а интерфейсы к ней делать уже на Framework или core.
Такое возможно?

04.06.2018 Провайдеры данных для .Net Core
 
Вот таблица: https://docs.microsoft.com/en-us/ef/core/providers/

Как я понял, для Oracle есть только у devart за деняжку?

31.05.2018 Можно ли где-то в VS 2017 прописать прокси для работы с веб-службой?
 
Приветствую.

Программирую на C# в VS 2017.

Возникла необходимость добавить ссылку на веб-службу ("Проект -> Добавить ссылку на службу"). Однако на моём рабочем месте этого сделать не удалось (Ошибка "Удаленный сервер возвратил ошибку: (407) Требуется аутентификация посредника."). На домашней машине к веб-сервису подключиться получается. Связь с интернетом на рабочем месте осуществляется через прокси. Служба безопасности предполагает, что VS 2017 не обучен использовать прокси для получения доступа к веб-сервису.

Помогите, пожалуйста решить проблему. Можно ли где-то в VS 2017 прописать прокси?.. На самой рабочей машине прокси прописан в настройках и интернет через браузер работает без проблем. По ссылке на службу в браузере рабочей машины браузер отправляет на страницу со службой без ошибок.

27.05.2018 DbConnection.CreateCommand и локальная транзакция
 
Хочу посоветоваться.

Должен ли DbConnection.CreateCommand привязывать создаваемую команду к активной локальной транзакции?

Я вот смотрю на поведение System.Data.OleDb — не привязывает.

И если попробовать запрос через такую команду — генерируется ошибка.

 {
  var cn=new xdb.OleDbConnection(TestServices.Conf__GetCnStr());

  cn.Open();

  using(var tr=cn.BeginTransaction())
  {
   var cmd=cn.CreateCommand();

   Assert.That(cn,Is.Not.Null);

   Assert.That(cmd.Connection,Is.SameAs(cn));

   Assert.IsNull(cmd.Transaction); // НЕ ПРИВЯЗЫВАЕТ

   cmd.CommandText="select ID from DUAL";

   var rd=cmd.ExecuteReader(); // КИДАЕТ ИСКЛЮЧЕНИЕ

   rd.Close();
  }//using tr
 }


System.InvalidOperationException : ExecuteReader требует, чтобы команда имела транзакцию, если подключение, назначенное команде, находится в отложенной локальной транзакции Свойство Transaction для команды не инициализировано.


По-моему это нелогичное поведение.

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

Тем более что DbConnection не предоставляет возможности определить наличие локальной транзакции — у него нет свойства типа CurrentTransaction.

Собственно говоря, я напоролся на эту проблему, передавая подключение с активной локальной транзакцией внутрь EntityFrameworkCore — он там юзает DbConnection.CreateCommand и (ясный пень) не привязывает полученную команду к этой локальной транзакции.

27.05.2018 Замена наследования на аггрегирование и фасад
 
Есть ли простой синтаксис для проделывания этого (без написания тупого кода вручную и использования генераторов из библиотек для тестирования)?

т.е.

public class ObservableMyClass
{
    public void MyMethod1() { ... }
    public void MyProperty1 { get; set; }
}

public class MyClass
{
    ObservableMyClass myObject;
    public MyClass(ObservableMyClass myObject) { this.myObject = myObject; }
    public void MyMethod1() { myObject.MyMethod1(); }
    public void MyProperty1 { get {return myObject.MyProperty1;} set{myObject.MyProperty1 = value;} }
}


Не хотелось бы руками писать для каждого метода и свойства обёртку, и много внешнего кода тянуть.

Наследование мне нельзя, потому что объекты MyClass у меня связаны с объектами ObservableMyClass отношением N к 1, а не 1:1

26.05.2018 Кто-нибудь видел ConcurrentSortedKeyedCollection TKey, TValu
 
Зачем мне такой?

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

21.05.2018 F# hello wordl: почему два оператора вместо одного?
 
let Привет |>

Начал на досуге глядеть в F# туториалы, и само собой полезли нубские вопросы. Скажем, работа с коллекциями:

// ------ Lists ------
let twoToFive = [2; 3; 4; 5]        // Square brackets create a list with
                                 // semicolon delimiters.
let oneToFive = 1 :: twoToFive   // :: creates list with new 1st element
// The result is [1; 2; 3; 4; 5]
let zeroToFive = [0; 1] @ twoToFive   // @ concats two lists


Внутренний перфекционист спрашивает: а зачем два оператора, :: и @, если можно было бы оставить и один из них?

  1. @-оператор требует всегда превращать одиночный элемент в коллекцию из одного элемента, наподобие [1] @ twoToFive
  2. cons-оператор (два двоеточия) ещё и запрещает переставлять аргументы местами (слева всегда должен быть одиночный элемент, а справа — коллекция).

Собственно, вопрос: в каких ситуациях может возникнуть та самая двусмысленность, из-за которой и пришлось ввести два разных оператора? Или это просто "исторически сложилось"?

21.05.2018 Nuget .net core+.net framework
 
Здравствуйте,
Можно ли из .net core проекта/библиотеки сделать nuget пакет, сразу для .net core и .net framework?
Или надо создавать отдельно файл проекта для .net framework?