23.07.2018 помогите найти ошибку
 
помогите найти ошибку! выскакивает окно с надрисью

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Data.dll
Additional information: Внутренняя ошибка поставщика данных .Net Framework Data Provider 1.


во время закрытия базы данных в диструкторе
(причем если вызвать освобождение не в диструкторе ошибки не будет)
namespace BoleroServer
{
class db
{
public SqlConnection connection;
private static db instance=null;

db() {
string connectionString = @"Data Source=.\SQLEXPRESS;
AttachDbFilename=C:\Users\vvva.GOMEL0\Desktop\f.mdf;
Integrated Security=True;
Connect Timeout=30;
User Instance=True";
// Создание подключения
connection = new SqlConnection(connectionString);//
connection.Open();
}
~db() {
if (connection != null)
connection.Close();//здесь ошибка
connection = null;
}
static public db getInstance() {
if (instance == null)
instance = new db();
return instance;
}

}
}

в чём может быть косяк?

23.07.2018 Генерация на основе T4-шаблона при изменении другого файла
 
Всем привет!

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

Можно ли это сделать стандартными средствами?

P.S. Благодаря помощи Михаила Романова, я уже написал собственный генератор для другой задачи, и он умеет группировать и отслеживать изменения в нескольких файлах. Но в данном случае хочется обойтись стандартными средствами, без необходимость встраивать кастомные тулы в окружение билдера.

Спасибо за любые подсказки.

20.07.2018 Глобальный mutex
 
Есть сервер, есть программа, которая должна выполняться в одном экземпляре (например, работа с COM портом)
На сервере могут одновременно работать несколько пользователей ( RDP )
Использование Mutex решает проблему частично — т.е. блокируется запуск второго экземпляра программы, но только для пользователя, из-под которого эта программа запущена.
Т.е. в другой сессии рабочего стола эта программа запускается.
Как сделать, чтобы можно было запустить только один экземпляр для всей системы?

19.07.2018 NPOI Word картинка
 
https://stackoverflow.com/questions/23514781/add-image-to-word-docx-using-npoi-library-c-sharp

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

18.07.2018 C# vNext nullable reference types
 
Кто еще не в курсе смотрите видос

https://youtu.be/CU5DEWZXgSI?t=39m19s

В новой версии будет опция, делающая ссылочные типы по умолчанию, не принимающими null.
Чтобы можно было передать null там где требуется string придется написать string?.
При обращении к optional-ref переменной компилятор будет проверять возможно ли обращение к null и ругаться.

18.07.2018 NPOI Word
 
Есть такая библиотека POI для Java и аналог для c# npoi. Не могу найти пример как поменять текст в Word по шаблону. Есть на java пример, но аналогов классов не нашёл, использовал reflector. Видел другие библиотеки npoi, какие-то дополнения, может в них?

17.07.2018 [ANN] linq2db.EntityFrameworkCore
 
Всем привет.

Мы наконец-то отрелизили первую версию сего гибрида и приглашаем попробовать.
Краткое введение тут linq2db.EntityFrameworkCore

Для чего это может пригодится:
  • вам нужно запустить linq запрос который, по каким-то загадочныы причинам, не работает в EF Core. Их много, включая проблемы с группировкой.
  • вам нужна скорость материализации обганяющая Dapper — смотреть картинки
  • вам нужна быстрая вставка тысяч или больше записей.
  • вам нужно удалить, изменить, скопировать тысячи записей по условию, когда ченж трекер делает обоим серверам нехорошо.
  • вам нужен быстренький linq запрос по системным таблицам, не добавлять же новые сущности в красивую, стройную, выплаканую неделями модель — не дай бог миграции завалятся.
  • вам нужен cross database запрос — мы это готовим.
  • вам нужны кастомные агрегаты, оконные функции, CTE и тд. — хоть кто-то знает SQL
  • вам нужна работа с временными таблицами.
  • вы устали писать хранимки на каждый «нестандартный» чих.

Все точно не перечислил, но главные преимущества надеюсь сюда попали.
Просьба писать о найденых недочетах или неудобствах на гитхаб

14.07.2018 Почему нельзя так писать?
 
в рамках одной функции
       var Fraction = new { pos = 0, neg = 0, zero = 0 };
       var result = arr.Select(a => a > 0 ? Fraction.pos++ : (a < 0 ? Fraction.neg++ : Fraction.zero++));

13.07.2018 как установить dotnet core 1.1.2 на ubuntu 18.04
 
Package 'liblldb-3.6' has no installation candidate
сам пакет могу скачать, но он не устанавливается на 18.04
нужели только 2.1 можно установить?

12.07.2018 как перехватить ответ с сервера
 
при помощи fiddler я получил ответ с веб сервиса, но в коде c# не могу этого сделать, потому что исключение в
clientSoap12.GetData(SearchINN);
There was an error while trying to deserialize parameter http://localhost/InfoTaxer:GetDataResponse. Please see InnerException for more details.
Inner Exception
'GeneratedMember' in type 'SearchINN.ServiceReference.EnumRefСтатусЗадолженности' cannot have EnumMemberAttribute attribute Value set to null or empty string.

public enum EnumRefСтатусЗадолженности : int {

[System.Runtime.Serialization.EnumMemberAttribute(Value="")]
GeneratedMember = 0,

public Nullable<SearchINN.ServiceReference.EnumRefСтатусЗадолженности> debt {
get {
return this.debtField;
}
set
{
if (value == null)
this.debtField = SearchINN.ServiceReference.EnumRefСтатусЗадолженности.GeneratedMember;

по правде не очень разбираюсь в веб сервисах

хотел получить хотя бы xml из ответа

вот что с сервера приходит

<m:debt/>

Если убрать Value="" в коде ниже
public enum EnumRefСтатусЗадолженности : int {

[System.Runtime.Serialization.EnumMemberAttribute(Value="")]
GeneratedMember = 0,

то исключение
Invalid enum value '' cannot be deserialized into type 'SearchINN.ServiceReference.EnumRefСтатусЗадолженности'. Ensure that the necessary enum values are present and are marked with EnumMemberAttribute attribute if the type has DataContractAttribute attribute.

11.07.2018 REST клиент
 
Чем сегодня модно пользоваться для REST в .NET ?
Я тут собрал набор разных библиотек.
Буду рад услышать кто чем пользуется и почему.

  • RestSharp library: http://restsharp.org/
  • HttpClient: https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=netstandard-2.0
  • ASP.NET Web client: https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Client/
  • Refit: https://github.com/reactiveui/refit
  • DalSoft.RestClient: https://github.com/DalSoft/DalSoft.RestClient
  • ServiceStack Http Utils: http://docs.servicestack.net/http-utils

  • 10.07.2018 WCF Unrecognized message version.
     
    в wdsl xmlns:soap12bind="http://schemas.xmlsoap.org/wsdl/soap12/" то есть SOAP1.2

    в коде
    return Message.CreateMessage(reader, maxSizeOfHeaders, MessageVersion);

    System.ServiceModel.CommunicationException: 'Unrecognized message version.'
    В отладчике
    MessageVersion.Envelope {Soap12 (http://www.w3.org/2003/05/soap-envelope)}

    проект
    https://github.com/dsalodki/INNsearch.git

    10.07.2018 WCF как задать SOAP12 для BasicHttpBinding
     
    или можно использоавать что-то другое?

    https://www.screencast.com/t/wh7fmByY

    WSDL содержит xmlns:soap12bind="http://schemas.xmlsoap.org/wsdl/soap12/"

    использую asp.net core 2.0 не знаю как использовать web.config

                var binding = new BasicHttpBinding();
                //binding.MessageVersion.Envelope
                binding.MaxReceivedMessageSize = 1048576;
                binding.SendTimeout = TimeSpan.FromSeconds(30);
                binding.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.TransportCredentialOnly;
                binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
                binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Basic;
                var endpoint = new EndpointAddress(new Uri(""));
                InfoTaxerPortTypeClient client = new InfoTaxerPortTypeClient(binding, endpoint);
                client.ClientCredentials.UserName.UserName = "";
                client.ClientCredentials.UserName.Password = "";
                Data result = await client.GetDataAsync(innSearch);

    07.07.2018 [EF Core] Выборка данных
     
    Положим есть следующая процедура

    var data = _db.Table.Where(...)
                        .OrderByDescending(...).ThenByDescending(...);
    
    foreach (var v in data)
    {
    ... 
    }


    EF генерит sql вида Select * from Table Where ...

    Вопрос: в этом случае, если записей в выборку попадает много EF вытащит все записи на клиента сразу или будет их как-то подгружать частями, освобождая память от уже обработанных?
    Будет ли поведение отличаться от случая если в запросе написать

    var data = _db.Table.Where(...)
                        .OrderByDescending(...).ThenByDescending(...).ToList();


    Зависит ли это от используемой СУБД?

    07.07.2018 Какую версию .NET требовать в своем установщике ?
     
    Работаю над плагином к офису, и возник вопрос, какую .net распространять с плагином (или требовать у пользователя).
    Как я понимаю, чем меньше версия, тем лучше (но некоторые фичи будут недоступны) — выше вероятность, что она уже окажется у пользователя.
    Как определить из visual studio, какая версия .net мне нужна? Обычно приложения включают .net framework installer нужной версии в свой .msi установщик, или лучше просить скачать с сайта майкрософта самостоятельно?

    06.07.2018 Автоматическая генерация исходников без ручной сборки проекта
     
    Всем привет!

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

    Я себе это вижу так — кастомная MSBuild-таска, которая стартится при попытке разрешить зависимость, которая проверяет, что файл шаблона изменился и заново генерирует дабавленные в проект исходники. Плюс запускает FSWatcher, который отслеживает изменения в этом файле.

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

    29.06.2018 2D-Linq и оптимизация цифровых фильтров - 3
     
    Ну, вот и пятница.

    Для начала, напустим интриги:
    BenchmarkDotNet=v0.10.14, OS=Windows 10.0.15063.1155 (1703/CreatorsUpdate/Redstone2)
    Intel Core i7-6600U CPU 2.60GHz (Skylake), 1 CPU, 4 logical and 2 physical cores
    Frequency=2742189 Hz, Resolution=364.6722 ns, Timer=TSC
      [Host]       : .NET Framework 4.6.1 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.2671.0
      LegacyJitX86 : .NET Framework 4.6.1 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.7.2671.0
    
    Job=LegacyJitX86  Jit=LegacyJit  Platform=X86
    Runtime=Clr
    
         Method |     Mean |     Error |    StdDev | Scaled |    Gen 0 |    Gen 1 |    Gen 2 | Allocated |
    ----------- |---------:|----------:|----------:|-------:|---------:|---------:|---------:|----------:|
     UnsafeLinq | 4.256 ms | 0.0849 ms | 0.0978 ms |   0.43 | 570.3125 | 375.0000 | 375.0000 |   3.83 MB |
        Perfect | 9.989 ms | 0.1198 ms | 0.1120 ms |   1.00 | 156.2500 | 156.2500 | 156.2500 |   3.81 MB |

    Вот код метода UnsafeLinq:
    public int[,] UnsafeLinq() => from d in data select (d[-1, 0] + d[1, 0] + d[0, -1] + d[0, 1]) / 4;

    Всё то же самое!

    Чёрт возьми, Холмс, как? Linq оказался вдвое быстрее "идеального варианта"...

    А вот, примерно, так:

            public static Filter<int, int> GenerateUnsafeFilter(Kernel<int, int> kernel)
            {
                var km = KernelMeasure.Measure(kernel);
    
                var ab = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("FixedTest"), AssemblyBuilderAccess.RunAndCollect);
                var tb = ab.DefineDynamicModule("FixedTest", "FixedTest.dll").DefineType("Filter." + kernel.Method.Name, TypeAttributes.Class | TypeAttributes.Public);
                var dm = tb.DefineMethod("Filter", MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Static, typeof(int[,]), new Type[] { typeof(object), typeof(int[,]) });
    
                var ilg = dm.GetILGenerator();
    
                var target = ilg.DeclareLocal(typeof(int[,]), true);
                var source = ilg.DeclareLocal(typeof(int[,]), true); // a replica of the arg1, to force the GC pinning
                var psource = ilg.DeclareLocal(typeof(int*));
                var ptarget = ilg.DeclareLocal(typeof(int*));
                var i_var = ilg.DeclareLocal(typeof(int));
                var j_var = ilg.DeclareLocal(typeof(int));
                var h_var = ilg.DeclareLocal(typeof(int));
                var w_var = ilg.DeclareLocal(typeof(int));
                var W_var = ilg.DeclareLocal(typeof(int));
    
                ilg.Emit(OpCodes.Ldarg_1); // source
                ilg.Emit(OpCodes.Ldc_I4_0);// 0
                ilg.Emit(OpCodes.Call, typeof(int[,]).GetMethod("GetLength", new Type[] { typeof(int) }));
                ilg.Emit(OpCodes.Stloc, h_var);
    
    
                ilg.Emit(OpCodes.Ldarg_1); // source
                ilg.Emit(OpCodes.Ldc_I4_1);// 0
                ilg.Emit(OpCodes.Call, typeof(int[,]).GetMethod("GetLength", new Type[] { typeof(int) }));
                ilg.Emit(OpCodes.Stloc, w_var);
    
                ilg.Emit(OpCodes.Ldloc, h_var);
                ilg.Emit(OpCodes.Ldloc, w_var);
                ilg.Emit(OpCodes.Newobj, typeof(int[,]).GetConstructor(new Type[] { typeof(int), typeof(int) }));
                ilg.Emit(OpCodes.Stloc, target);
    
                ilg.Emit(OpCodes.Ldloc, w_var);
                ilg.Emit(OpCodes.Stloc, W_var);
    
                ilg.EmitIncrease(h_var, -km.ymax);
                ilg.EmitIncrease(w_var, -km.xmax);
    
    
                ilg.Emit(OpCodes.Ldarg_1);
                ilg.Emit(OpCodes.Stloc_S, source); // pinning the source array
    
                ilg.EmitFor(i_var, 0 - km.xmin, h_var, () =>
                {
    
                    ilg.Emit(OpCodes.Ldloc, source);
                    ilg.Emit(OpCodes.Ldloc, i_var);
                    ilg.Emit(OpCodes.Ldc_I4, -km.ymin);
                    ilg.Emit(OpCodes.Call, _arrayAddressGetter);
                    ilg.Emit(OpCodes.Conv_U);
                    ilg.Emit(OpCodes.Stloc, psource);  // psource = &source[i, lb];
    
                    ilg.Emit(OpCodes.Ldloc, target);
                    ilg.Emit(OpCodes.Ldloc, i_var);
                    ilg.Emit(OpCodes.Ldc_I4, -km.ymin);
                    ilg.Emit(OpCodes.Call, _arrayAddressGetter);
                    ilg.Emit(OpCodes.Conv_U);
                    ilg.Emit(OpCodes.Stloc, ptarget); // ptarget = &target[i, lb]
    
                    ilg.EmitFor(j_var, 0 - km.ymin, w_var, () =>
                    {
                        ilg.Emit(OpCodes.Ldloc_S, ptarget); // :ptarget
    
                        var usilv = new UnsafeInliningILInstructionVisitor(ilg, i_var, j_var, psource, W_var);
                        new ILReader(kernel.Method).Accept(usilv);
                        //EmitDebug<int>(ilg);
    
                        ilg.Emit(OpCodes.Stind_I4);
    
                        ilg.EmitIncrease(psource, 4); // psource++
                        ilg.EmitIncrease(ptarget, 4); // ptarget++
                    });
                });
    
                ilg.Emit(OpCodes.Ldloc, target);
                ilg.Emit(OpCodes.Ret);
    
                var type = tb.CreateType();
                var mi = type.GetMethod("Filter");
                var inlined = (Func<object, int[,], int[,]>)mi.CreateDelegate(typeof(Func<object, int[,], int[,]>));
    
                int[,] filter(int[,] data) => inlined(kernel.Target, data);
                return filter;
            }

    Внимательный взгляд, конечно же, увидит, что у делегатов Filter и Kernel теперь появилось два параметра. Это отражение развития, которое идёт в параллельной ветке обсуждения, где тип выходного массива не обязательно совпадает с типом входного.
    Кроме того, в отличие от GenerateFilter, новая версия метода уже не-generic. В той версии C#, которая у меня, невозможно выразить констреинт "тип, от которого можно взять managed pointer", поэтому пришлось гвоздями прибить метод к int-у.
    Тем не менее, с задачей с4-фильтрации исходного массива метод справился на ура.
    Мы добавляем немного чёрной магии при помощи pinned переменных — результат сразу сохраняется в такой переменной, а входные данные приходится скопировать из arg.1 в переменную source.
    В цикле — развлекаемся адресной арифметикой, зная внутреннее устройство двумерных массивов в CLR.
    Таким образом, мы избегаем проверок на выход за границы массива, которые, судя по показаниям профайлера, съедают примерно 50% времени работы "безопасной" версии метода.
    Что характерно, пользовательский код остаётся вполне себе Safe — всё вуду происходит только "под капотом".

    Замена вызова при инлайне происходит тоже чуточку посложнее:
                protected override void EmitSourceAccessCode()
                {
                    //          Opcode                   Stack state (head left)
                    //                                     dy, dx, psource, ...
                    Target.Emit(OpCodes.Ldloc, _w);    // w, dy, dx, psource
                    Target.Emit(OpCodes.Mul);           // w*dy, dx, psource, ...
                    Target.Emit(OpCodes.Add);           // w*dy+dx, psource, ...
                    Target.Emit(OpCodes.Ldc_I4_4);      // 4, dy + w*dx, psource, ...
                    Target.Emit(OpCodes.Mul);           // 4 * (w*dy +  dx), psource, ...
                    Target.Emit(OpCodes.Add);           // psource + 4 * dy + 4*w*dx, ...
                    Target.Emit(OpCodes.Ldind_I4);      // psource[dy*w+dx]
                }

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

    Итак, принципиальная возможность "обогнать" ручное выпиливание циклов при помощи красивого Linq — продемонстрирована.
    В следующей серии я попробую показать, как Linq офигенен для решения более сложных задач
    Автор: Pavel Dvorkin
    Дата: 29.06 07:04
    , несмотря на сомнения скептиков.

    28.06.2018 EF Core. Разность строк одной таблицы
     
    Есть две таблицы. Мастер — деталь. В детали — число предметов на определенную дату.
    Как с помощью EF и Linq посчитать разницу предметов по датам? Т.е. фактически нужно вычесть из сегодняшнего числа вчерашнее. И так для каждой записи мастера. Записей может быть много.
    И при этом не положить ни сервер бд ни сервер приложения.
    СУБД — MariaDb

    28.06.2018 agsXMPP - не могу поймать исключение
     
    есть приложение, sta, .net-4.0, winforms
    в нем используется jabber клиент agsXMPP
    подписки на AppDomain.CurrentDomain.UnhandledException и Application.ThreadException есть.
    иногда, при проблемах со сетью из недр agsXMPP падает исключение, которое не где не отлавливается и не попадает в логи.
    приложение падает, в журнале событий появляется эксепшен.

    Приложение: ....
    Версия платформы: v4.0.30319
    Описание. Процесс был завершен из-за необработанного исключения.
    Сведения об исключении: System.NullReferenceException
    
    
    в agsXMPP.Xml.StreamParser.Push(Byte[], Int32, Int32)
       в agsXMPP.XmppConnection.SocketOnReceive(System.Object, Byte[], Int32)
       в agsXMPP.net.BaseSocket.FireOnReceive(Byte[], Int32)
       в agsXMPP.net.ClientSocket.EndReceive(System.IAsyncResult)
       в System.Net.LazyAsyncResult.Complete(IntPtr)
       в System.Net.ContextAwareResult.CompleteCallback(System.Object)
       в System.Threading.ExecutionContext.runTryCode(System.Object)
       в System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object)
       в System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
       в System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
       в System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
       в System.Net.ContextAwareResult.Complete(IntPtr)
       в System.Net.LazyAsyncResult.ProtectedInvokeCallback(System.Object, IntPtr)
       в System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
       в System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)


    я не понимаю, как я должен поймать это исключение. почему все приложение у меня падает?
    может подскажите — куда копать.
    у меня только две идеи:
    1. копать внутрь agsXMPP и что-то там фиксить
    2. работу с agsXMPP вывести в отдельный процесс.

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

    28.06.2018 Совмещение кода на C# и С++
     
    Пишу некое расширение для среды разработки. Ядро с логикой на С++, и к ней "фронтэнды" для разных IDE, в частности для QtCreator уже есть и надо делать для Visual Studio. Причем скорее всего на C#, поскольку большинство примеров аддинов для студии именно на C#.
    Вопрос — как это совместить с точки зрения организации кода?
    Опыта на C# почти нет, поэтому задаю вопрос в этом разделе.
    Разумеется крайне желательно удобство собрки и отладки. Идеально просто чтобы в одном проекте лежали файлы cs и cpp, но такое вроде нельзя. А как можно и как лучше сделать? Через dll и писать обертки в c#-коде? Очень уж не хочется писать вручную обертки, хочется чтобы все было автоматически.

     
     
     
     
    10.12  .NET Reactor
    15.11  n
    15.11  C# ClickOnce
     
    18.07  NPOI Word