23.10.2017 Новый ref readonly в C# & IL
 
Вот такое 20го числа майкрософт зарелизила:

class Type1
{
    // This parameter will have an attribute (in IL) of type `IsReadOnly`
    public void Method1(ref readonly int param1) { throw null; }

    // This method return type will have an attribute (in IL) of type `IsReadOnly`
    public ref readonly int Method2() { throw null; }
}


Зачем верхний (input) понятно, хотя может и не до конца.

А зачем нижний (return)? Туплю

Если можно пример парами — как раньше делалось и как теперь это готовить

И зачем оно в IL нужно, можно же было только си-шарпом обойтись

22.10.2017 Указатели и обобщения
 
Перевожу код из C++/CLI, который использует шаблоны и указатели в C#.
Однако C# пока ещё не позволяет использовать указатели с обобщениями.

struct A<T> {}

A<int>* p; // :(


Один из вариантов это через Marshal.PtrToStructure, что приведёт к лишним копиям, и 'struct' вдобавок придётся заменить на 'class'.
Другое решение через генерацию в виде .tt файла.

Есть другие интересные способы решить эту задачу?

19.10.2017 Неявная реализация интерфейса
 
Допустим есть:
class Foo
{
 public void Some()
 { 
 }
}

interface IMySuperSome
{
  void Some();
}


Хочется следующего:
public void Write(IMySuperSome s)
{
}
...

Write(new Foo());

Ну естественно чтобы компилировалось и проверялось статически. Собственно по каким причинам решили так не делать?

16.10.2017 int64: асинхронно передать C# - C++ - C# через void*
 
Коллеги, привет

Столкнулся с задачей:
  1. C# дёргает запрос в C++/CLI
  2. C++/CLI дергает сишную либу, у которой можно передать void* в качестве пользовательских данных
  3. сишная либа вызывает свой асинхронный код
  4. сишный асинхронный код дёргает callback, который через С++/CLI слушается в C# — туда можно пробросить этот void*, чтобы понимать, к какому запросу относится эта callback-нотификация

Был бы int — проблем нет, но тут int64, а билд всего этого безобразия в 32 bit и никак иначе (т.е. sizeof(void*) равен 4, апгрейд на 64 бита аппаратно невозможен). Как на ваш взгляд элегантней всего пробросить его через эту цепочку managed-unmanaged-managed?

16.10.2017 Многопоточная блокирока
 
Добрый день,
В многопоточном приложении часть кода закрыта оператором lock.
private object lockObject = new object();
...
public void Method1(){
lock(lockObject){
...
}
}

public void Method2(){
??? if(lockObject){...}???
}

Как снаружи блока не обращаясь непосредственно к нему другим потоком узнать заблокирован он или нет?

16.10.2017 Указатель против управляемой ссылки
 
Есть ли принципиальное различие в производительности между указателем и управляемой ссылкой для значимых типов ?

struct A { ... } 

void F(ref A a) {..}
void G(A* a) { .. }


Для F и G генерируется одинаковый IL за исключениям параметра a который принимает тип 'valuetype A& a' в F и 'valuetype A* a' в G.

11.10.2017 Как работает _IOCompletionCallback?
 
Всем привет!

При работе с сетевыми интерфейсами, например, посредством TcpListener, при помощи старых добрых Begin/End AcceptTcpClient, формируется довольно подозрительный стек:

System.Threading.WaitHandle.InternalWaitOne(System.Runtime.InteropServices.SafeHandle, Int64, Boolean, Boolean)
System.Threading.WaitHandle.WaitOne(Int32, Boolean)

MyListener..OnAcceptConnection(System.IAsyncResult)

System.Net.LazyAsyncResult.Complete(IntPtr)
System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
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*)
GCFrame
DebuggerU2MCatchHandlerFrame


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

11.10.2017 GAC и ngen
 
Применяет ли система прекомпиляцию для сборок, которые добавляются в GAC. Или же нужно дополнительно запускать ngen?

10.10.2017 Про версии сборок (сохранился ли ад?)
 
Как правильно разрулить, если одна сторонняя библиотека ссылается на версию 6.1 JSON.net, а вторая на версию 10? Размещать в разных папках (ведь название у либ одинаковое) и в прописывать в конфиге?

10.10.2017 SqlTypes
 
using (var db = new ServiceEntities())
{
    var temp = db.Cities.FirstOrDefault(x=>x.Enabled);
}

System.InvalidOperationException: 'Spatial types and functions are not available for this provider because the assembly 'Microsoft.SqlServer.Types' version 10 or higher could not be found. '

установил через nuget Microsoft.SqlServer.Types
в web.config
прописал
<dependentAssembly>
<assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
<bindingRedirect oldVersion="14.0.0.0" newVersion="14.0.0.0" />
</dependentAssembly>

08.10.2017 SQL Server CE -- как понять где проблема?
 
Собственно, выбрал SQL Server CE как базовую для проги. Можно переключать, но для не опытных она автоматом стоит. Выбрал как наименее гемморную для EF, для которой из коробки все работает (для SQLite нужно вручную создавать таблицы, а это мне не приятно).

Но есть одна заноза. На моем компе все работает шустро, подключается за 1 сек. А на других компах с тем же окружением, с более быстрым железом, той же версией Windows и .Net, с той же версией SQL CE 4.0 SP 1 -- подключение происходит 5-7 сек.

В чем может быть заноза? Как бы лучше найти?

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

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

Есть возможность интерпретировать выражения. В одно поле вбиваешь выражение, в другом видишь результат.

В общем, если кому интересно — пользуйтесь и допиливайте.

https://github.com/rsdn/MSBuildProjectBrowser

https://snag.gy/Y246tQ.jpg

29.09.2017 dotTrace на бою
 
Коллеги,
Предположим есть некоторый сервис, написанный на .net.
При тестировании не получается воспроизвести проблемы с производительностью. Как можно посмотреть что происходит на бою. Ибо при подключении dotTrace сервис будет сильно тормозить, а этого хотелось бы избежать.

29.09.2017 посоветуйте пожалуйста книжку для изучения С#
 
посоветуйте пожалуйста книжку для изучения С#
есть опыт на плюсах

29.09.2017 Система безопасности .Net -- жива ли?
 
Вот интересно, жива ли и юзается ли кем-либо?

Что нужно знать, если твоя библиотека не использует критических операций и ты бы хотел, чтобы ее могли заюзать без перекомпиляции в системах ограниченной безопасностью? Только проставить assembly: AllowPartiallyTrustedCallers ?

Вот, смотрю одну из популярных либ:

#if (!NETCF)
//
// If log4net is strongly named it still allows partially trusted callers
//
[assembly: System.Security.AllowPartiallyTrustedCallers]
#endif

#if (NET_4_0)
//
// Allows partial trust applications (e.g. ASP.NET shared hosting) on .NET 4.0 to work
// given our implementation of ISerializable.
//
[assembly: System.Security.SecurityRules(System.Security.SecurityRuleSet.Level1)]
#endif


CF умер, посему, получается, AllowPartiallyTrustedCallers ставим для всех. А вот вторая строчка, как я понял, переводит проект на старую схему проверки безопасностью.

В общем, что можете сказать по этому поводу? Если у тебя библиотека и ты думаешь что она не использует SecuritySritical, то что тебе нужно сделать?

З.Ы.
Ранее всегда ставил AllowPartiallyTrustedCallers и юзал прогу, запускает другие проги с ограниченными правами http://managedsandbox.codeplex.com/

27.09.2017 Использование интерфейсов для бизнес-объектов
 
Если в вашем проекте бизнес-объекты в контрактах определены в виде классов, то при передаче из одного слоя в другой
Автор: Shmj
Дата: 26.09 15:44
происходит двойное преобразование. Сначала вы преобразовываете объекты слоя A к объектам общего вида (которые определены в контрактах), затем из объектов общего вида преобразуете к объектам слоя Б.

А если вы юзаете интерфейсы без конкретных реализаций -- то будет одно преобразование, так как объект любого слоя в одну сторону преобразовывается к интерфейсу автоматически.

В мире Java такая схема более распространена. А вот в .Net интерфейсы создают только для сервисов а бизнес-объекты выполняются в виде классов. Даже в том же Guidelines есть рекомендация:

DO NOT use weakly typed collections in public APIs. +
The type of all return values and parameters representing collection items should be the exact item type, not any of its base types (this applies only to public members of the collection). 1


Т.е. для коллекций рекомендуют возвращать конкретный тип, а не базовый или интерфейс. Почему же? В чем минус? Ведь один хрен между слоями происходит копирование.

26.09.2017 Про бизнес-объекты: для сохранения, для API, для внутреннего
 
По сути код работает со структирированными данными. Назовем бизнес-объекты.

Практически в каждом проекте эти данные используются для 4-5 вещей:

1. Для внутреннего потребления, т.е. вы некие классы передаете/принимаете в своих методах и что-то с ними делаете.

2. Для сохранения. Как правило ORM позволяет сохранять сами эти структуры данных. Но так просто не получается -- их нужно либо наделить атрибутами либо кодогенерацией (ну или XML-описанием).

3. Эти же структуры данных иногда приходится сохранять на диск в неком формате без ORM. К примеру для сохранения в xlsx-файл.

4. Эти же структуры вам нужно отдавать через REST/SOAP-API внешним пользователям.

5. Эти же структуры вам нужно получать из внешнего API, от которого уже вы зависите.

Главное неудобство вижу в том, что по стуи очень похожие структуры в каждом из этих 5 случаев нужно копировать одну в другую. Потому что они хотя и похожи, порой на 90%, но все же отличаются. К примеру в одном случае требуется обязательное наличие set-еров, иначе библиотека отказывается работать с данными (к примеру, стандартная XML-сериализация требует чтобы у списка был set-ер). Но наличие set-еров противоречит внутренней парадигме.

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

25.09.2017 Как более быстро искать подходящий диапазон в списке?
 
Всем привет!

Есть таблица с записями такой структуры (числовые диапазоны [FirstNumber..EndNumber] не пересекаются):
internal class Range
{
    internal ulong FirstNumber;
    internal ulong EndNumber;
    internal string Data;
|

Записей несколько сотен тысяч
Надо загнать ее в память (в какую-нибудь структуру) и быстро по числу найти запись с диапазоном, в который входит это число
Что посоветуете в смысле алгоритма поиска? Нужен быстрый, перебором не пойдет...
Спасибо

23.09.2017 EF -- при переключении .Net с 4.7 на 4.0 подключается 6 сек.
 
Когда тестировал EF CodeFirst + SQL Server CE все было нормально.

Когда уже почти релиз и начал запускать реальную прогу -- опустил руки. Не такая большая там база но при первом подключении -- приходится ждать 6-7 секунд пока подключится. Фигня какая то...

Начал копать, неужели я при выборе решения не обратил внимания на эту проблему.

Оказывается в тестовом приложении у меня было установлено .Net 4.7. А в реальном требуетя .Net 4.0 для совместимости.

Версии библиотек все те же самые. Добавляю через NuGet.

Если изменить тип проекта на 4.0, удалить библиотеки EntityFramework, EntityFramework.SqlServerCompact и добавить их заново ту же версию (только ссылка будет уже на 6.1.3\lib\net40) -- прога при подключении впадает в кому.

Что делать, где искать?

22.09.2017 WSDL генерит неправильный SoapAction
 
Всем привет!

Есть WSDL от стороннего сервиса
Содержит в себе такой раздел
<wsdl:operation name="SecurityAuthenticate">
<soap:operation soapAction="http://webservices.alienDomain.com/1ASIWVISVIP/VLSSLQ_06_1_1A" />
Этот Action является правильным

Но при этом в сгенеренном классе получается
[OperationContract(Action = "http://xml.alienDomain.com/AlienDomainWebServicesPT/SecurityAuthenticateRequest",

Свойство атрибута попадает в заголовок SoapAction и запрос не работает
Почему так происходит и как решить эту ситуацию?
Спасибо...

Подменять Action динамически не хочется, методов там много
Руками править сгенеренные классы тоже

 
 
 
 
10.12  .NET Reactor
15.11  n
15.11  C# ClickOnce
 
11.10  GAC и ngen
10.10  SqlTypes