Отправляет email-рассылки с помощью сервиса Sendsay

RSS-канал «Форум '.NET' на RSDN»

Доступ к архиву новостей RSS-канала возможен только после подписки.

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

   

Подписаться на другой RSS-канал, зная только его адрес или адрес сайта.

Код формы подписки на этот канал для вашего сайта:

Форма для любого другого канала

Последние новости

Clr via C#
2024-03-29 13:04 peer

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

Детект прав админа у пользователя
2024-03-28 19:20 VladD2

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

Стоит задача понять, что пользователь имеет права локального админа (и стало быть способен произвести обновление софта).

Желательно сделать проверку без привлечения лишних (особенно сторонних) либ.

Как проще всего это сделать?

На входе есть имя учетки (включая домен или имя компа) и пароль.

Нашел вот такой пусть:
        bool valid = false;
        using (var context = new PrincipalContext(ContextType.Machine))
        {
            valid = context.ValidateCredentials(userName, password);

            var grp = GroupPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "Administators");
            var user = UserPrincipal.FindByIdentity(context, userName);

            foreach (Principal p in user.GetAuthorizationGroups())
            {
                Debug.WriteLine(p);
                if (p.ToString() == "Administrators")
                {
                    // Administrator
                }
            }
        }


Но как-то перебором искать так себе идея. Плюс приходится использовать нюгет-пакет System.DirectoryServices.AccountManagement, что добавляет лишнего веса и хлопот.

Новости C#13. params
2024-03-14 18:44 rameel

В превью версию C#13 добавили для так называемой `params` collections поддержку IEnumerable<T> и ReadOnlySpan<T>. Значит скоро можно будет писать вот так
void M(params IEnumerable<int> numbers);
void M(params ReadOnlySpan<int> numbers);


https://x.com/jcouv/status/1767967748259545522

ЗЫ. Из proposal вытекает, что поддерживаются также

* System.Span<T>
* System.Collections.Generic.IEnumerable<T>,
  System.Collections.Generic.IReadOnlyCollection<T>,
  System.Collections.Generic.IReadOnlyList<T>,
  System.Collections.Generic.ICollection<T>,
  System.Collections.Generic.IList<T>
* Класс или структура, который реализует IEnumerable, если есть доступный конструктор без аргументов, и экземплярный (не extension) метод Add.
* Класс или структура со статическим методом Create.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>

Передать this в виде object
2024-03-14 12:27 drVanо

Нужно передать ссылку на ValueType в виде object, чтобы через object можно было менять содержимое структуры:
        struct Point
        {
            public int x;
            public int y;
            public Point(int a, int b)
            {
                x = a;
                y = b;
            }

            public void Move(int a, int b)
            {
                MoveObject(this, a, b);
                Console.WriteLine("point from this: {0}.{1}", x, y);
            }

            static void MoveObject(object obj, int a, int b)
            {
                var p = (Point)obj;
                p.x += a;
                p.y += b;
                Console.WriteLine("point from object: {0}.{1}", p.x, p.y);
            }
        }

...

        public static void Main()
        {
            var p = new Point(1, 2);
            p.Move(9, 8);
        }


Сейчас в MoveObject получаем копию Point, а не ссылку на начальную структуру.

крепостные объекты
2024-03-07 12:24 Qulac

В net можно прикрепить объект к памяти запретив сборщику мусора его перемещение. Пишут, что это может быть полезно для увеличения производительности приложения. А при каких сценариях работы с объектами это лучше использовать?

Не крутится progressBar
2024-03-07 10:36 Funny Rabbit

Есть такой код.
private void btnSelectFileWithVins_Click(object sender, EventArgs e)
{
    if (txtFixStation.Text == "")
    {
        MessageBox.Show("Выберите станцию.");
        return;
    }

    if (ofdVIN.ShowDialog(this) == DialogResult.OK)
    {       
        backgroundWorker.RunWorkerAsync(progressBar.Value);  
        Cursor = Cursors.WaitCursor;
        Tuple<int, int> rowsProcessed = WriteVins(ofdVIN.FileName);
        Cursor = Cursors.Default;
                        
        MessageBox.Show("Успешкно обработано - " + rowsProcessed.Item1.ToString() + " строк. Ошибок - " + rowsProcessed.Item2.ToString());
    }
}
       
private void backgroundWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{            
    if (progressBar.Value == progressBar.Maximum)
    {
        progressBar.Value = progressBar.Minimum;
    }
}

private void backgroundWorker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
    progressBar.Value = progressBar.Minimum;
}

private void backgroundWorker_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
    progressBar.Value = e.ProgressPercentage;
}


Почему то не крутится прогрессбар. В чем может быть проблема?

Unsafe mem mapping
2024-02-27 10:19 Sаныч

Появился ли в последний версия языка что-то для сабжа более правильный с т.з. дизайна кода? Сейчас делаю так

[StructLayout(LayoutKind.Explicit)]
struct NativeStruct
{
    [FieldOffset(0)]
    public int Field1;

    [FieldOffset(4)]
    public uint Field2;
    
    // дальше
}

fixed (byte* map = &_readBuffer[0])
{
    return *(NativeStruct*)map;
}


Читал про Span<T> но не понял как его применить для задачи, если он вообще применим для такого.

middleware exception
2024-02-26 22:28 undo75

вот класс есть

    /// <summary>
    /// Отлов ошибок.
    /// </summary>
    public class ExceptionMiddleware : ExceptionFilterAttribute
    {
        public bool AllowMultiple => false;

        public override void OnException(HttpActionExecutedContext context)
        {
            var actionContext = context.ActionContext;
            if (actionContext != null)
            {
                // в UserAuthorize и UserRight атрибутах кидаются такие ошибки, и до пользователя доходила 500 ошибка
                if (context.Exception is HttpResponseException ex &&
                    (ex.Response.StatusCode == HttpStatusCode.Unauthorized || ex.Response.StatusCode == HttpStatusCode.Forbidden))
                {
                    throw context.Exception;
                }

                if (context.Exception is NotFoundException)
                {
                    throw new HttpResponseException(actionContext.Request.CreateErrorResponse(HttpStatusCode.NotFound, context.Exception.Message));
                }

                if (context.Exception is AccessDeniedException)
                {
                    throw new HttpResponseException(actionContext.Request.CreateErrorResponse(HttpStatusCode.Forbidden, context.Exception.Message));
                }
и т.д.



стоит цель из сервиса пробросить в апишку (контроллер) чтоб он соотвственно вернул throw new HttpResponseException . можно на пальцах как это реализуется?

Константы. Класс или структура?
2024-02-21 07:41 Разраб

Эти конструкции эквивалентны или нет?
public static class ClassConst 
{
  public const int Zero = 0;
}

public struct StructConst 
{
     public const int  Zero = 0;
}

отладка на железном линухе
2024-02-11 09:35 novitk

Правильно ли я понимаю, что отлаживать на Linux не удаленно можно только в Rider, то есть vscode бесполезен от слова совсем?
Я тут играюсь с F# и мне оно даже нравится, но как-то неуютно. MS собирается это исправлять?

Ошибка при публикации проекта
2024-02-07 12:34 Funny Rabbit

Вот такое сообщение выходит. Права на запись в каталог есть.

"C:\Users\gw07007298\source\repos\mes\GWM.MES.App\bin\Debug\app.publish\Application Files\GWM.MES.App_1_2_97_13\GWM.MES.Common.dll.deploy" в "\\mes-test.hmmr.ru\mes-test-update\Application Files\GWM.MES.App_1_2_97_13\GWM.MES.Common.dll.deploy". Не удалось добавить "Application Files/GWM.MES.App_1_2_97_13/GWM.MES.Common.dll.deploy" к веб-сайту. Не удается добавить файл "Application Files\GWM.MES.App_1_2_97_13\GWM.MES.Common.dll.deploy". Системе не удается найти указанный путь. GWM.MES.App 1


В чем может быть проблема?

Профилирование .net 6.0 (и выше) на Linux(Ubunta).
2024-02-05 22:38 Sharov

Здравствуйте.

А кто как профилирует .net 6.0 приложение под линупсом? Есть какие-нибудь инструменты у мс или jb для этого?
Нужно что-то типа dotmemory и dottrace. А какие существующие утилиты для линукса могут помочь в профилирования
dotnet приложений? Или особой разницы в поведении под win и линукс у CLR и платформы (dotnet) в целом нету, соотв.
можно результаты win эктрапалировать на линупс?

Заранее благодарю.

Лямбда и модификаторы параметра (ref/out) — новости
2024-02-05 16:25 _FRED_

В продолжение Лямбда и модификаторы параметра (ref/out)

Надо же, 12 лет почти прошло, а работа движется спека ждёт обсуждения // Мораль: смысл заводить тикеты есть всегда, не пренебрегайте

Хотят разрешить все возможные модификаторы:

Allow lambda parameter declarations with modifiers (in / ref / out / ref readonly / scoped / scoped ref / params) to be declared without requiring their type names.

Класс не зарегистрирован 8040154
2024-02-05 11:12 Funny Rabbit

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

docx. Добавить картинку в колонтитул
2024-02-03 13:58 BlackEric

Добрый день.

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

Какие библиотеки использовать и нет ли примера кода?

Убрать тормоза сервиса
2024-02-03 12:19 RushDevion

Приветствую, коллеги.
Нужна помощь зала.

Имеем сервис: .net core, асинхронное (async/await) REST API которое читает/пишет из БД или кэша (Redis), фоновый обработчик на Hangfire, крутится на ubuntu.
Нагрузка слабая: ~4-7 rpc днем, по ночам падает до 0.1-1 rpc.
Есть логи и базовые метрики (память, cpu, кол-во запросов, время ответа и т.п.).
Память держится в пределах 40-100 Мб, треды — в пределах 8-12 штук.
95% по времени ответа ~10-50 мс (меряется именно время работы хендлера, без чтения/записи запроса/ответа).
Но, когда нагрузка спадает, то 99% начинает давать пики в 400-1200мс.
Заметна четкая корреляция с rpc: при штатной нагрузке отвечаем быстро, нагрузка ушла вниз и потом (спустя время) вверх — появляется пик.
Это буквально единичные запросы, ~0.2% от общей массы.
По логам они ничем не отличаются от обычных: sql запросы и чтение/запись из кэша отрабатывают так же быстро, как у остальных.
Было предположение, что дело в тред.пуле.
Типа когда нагрузка уходит, шедулер начинает прибивать лишние треды.
Соответственно, когда после понижения идет рост rpc, шедулеру нужно время на раскачку.
Подкрутил настройку minWorkerThreads в пуле, пики просадки стали чуть ниже — 300-700мс, но совсем не исчезли.

Не то, чтобы это было критично, но все же хочется убрать и эти 0.2% тормозов, т.к. объективных причин для них не видно.
Вот как бы их отследить, чтобы понять, в чем дело?
Что-то типа perfcollect/dotnet-trace collect, но не для всего подряд, а только для медленных запросов.

Есть идеи?