|
Модератор
|
|
Как определить из кода библиотеки Standard платформу приложения (Forms, WPF, UWP, Framework, Core и т.д.)?03.01.2024, 18:13. Показов 3015. Ответов 21
Метки нет (Все метки)
Есть некий код в библиотеке типа Standard 2.0
В зависимости от типа приложения нужно по разному реализовать некоторые тонкие моменты. Типовой подход: создание разных библ (сборок) под разные платформы. Но хотелось бы избежать этого.
0
|
|
| 03.01.2024, 18:13 | |
|
Ответы с готовыми решениями:
21
UWP и Entity framework core
VS2019, в чем разница, приложение WPF (.Net Framework) и App WPF (.NET Core) |
|
|
|
| 03.01.2024, 18:33 | |
|
А разве Forms это не тот же Framework или Core, в зависимости от версии языка?
А по коду помоему не определить. Это же незря добавляют в код в виде метакода типа "#if DEBUG". Читать тут: C# preprocessor directives Поэтому если большое желание есть этим управлять в глубоком коде, то можно в этих блоках набодяжить свои переменные которые будут иметь нужные значения.
1
|
|
|
Модератор
|
||
| 03.01.2024, 18:56 [ТС] | ||
|
Командe для WPF лучше автоматически подписаться на CommandManager.RequerySuggested. Для остальных платформ этого не следует делать. Так же есть различия в маршалинге событий из разных потоков. Реализовать эти различия я смогу. Но вот неуверен насчёт надежного детектирования платформы приложения в рантайм.
0
|
||
|
|
||
| 03.01.2024, 19:26 | ||
|
А вот то что у вас в рантайме разный код "лучше" выполнять. То я бы сразу смотрел в сторону явного переноса реализации. Ну типа чтобы в каждом платформенном проекте был метод (одного интерфейса) для какой-то настройки. И тогда в рантайме то он точно же должен вызывать верную реализацию. Ну а там уже делайте что лучше в этой платформе.
1
|
||
|
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
|
||
| 04.01.2024, 14:01 | ||
|
Возможно, более оптимальным вариантом будет выпустить базовый пакет с абстракциями, а потом несколько пакетов с реализациями этих абстракций (с зависимостью от пакета с ними). Как мне кажется, так конечному пользователю было бы удобнее. Нужно просто установить пакет для своей платформы (WPF, WF, etc), чем ставить тот же один пакет, но заточенный под все подряд, и пытаться угать, не сломается ли ничего конкретно в его случае. Если делаете только для себя, то вариант с несколькими пакетами будет выглядеть еще более оптимально, потому что минусы в виде строго одинакового версионирования нескольких пакетов, поддержки валидации корректных версий зависимостей и т.д. отпадают.
1
|
||
|
Модератор
|
||
| 04.01.2024, 15:12 [ТС] | ||
|
Есть ViewModel. Логика полностью едина для любой платформы. Но вот реализация INPC и Комманд несколько различны. Так же различается синхронизация INCC. Можно, конечно, сделать такую VM платформозависимой и компилировать по разному для разных платформ. Но вот обдумываю и вариант единой сборки в которой в рантайм будет определяться платформа UI и подтягиваться нужные реализации.
0
|
||
|
1339 / 919 / 264
Регистрация: 08.08.2014
Сообщений: 2,763
|
||||||
| 04.01.2024, 17:51 | ||||||
|
Штатными средствами никак, вроде. Разве что лезть напрямую в память и искать там характерные сборки по сигнатуре. Менее упоротый вариант - пытаться в try/catch через рефлекшн инстанциировать специфичные для каждой платформы типы. Упал - значит не та платформа, успешно - значит та. Написать отдельные методы типа 'IsWPF', 'IsWF' и т.п., дёргать их на старте, сохранять результа и ок (правда, там есть нюанс - в WPF-приложении будут в т.ч. и WF-типы).
Добавлено через 8 минут Ну т.е. что-то типа:
1
|
||||||
|
Модератор
|
||
| 04.01.2024, 23:09 [ТС] | ||
|
"Дергаю" типы и их члены из сборок специфичных для платформы (точно не помню, но вроде эти): System.Windows.Application.Current - PresentationFramework.dll System.Windows.Forms.Application.OpenFor ms - System.Windows.Forms.dll Windows.UI.Xaml.Application.Current - Windows.UI.Xaml.dll Нужно ещё добавить для Xamarin, WinUI, Avalonia, UNO.... Слишком громоздко получается. Поэтому и подумал: может есть что-то попроще?
0
|
||
|
14093 / 9310 / 1349
Регистрация: 21.01.2016
Сообщений: 34,983
|
|
| 05.01.2024, 06:32 | |
|
Элд Хасп, тут или через рефлексию искать "специальные" типы соответствующие платформе, что полная лажа, или собирать под каждую платформу отдельную версию сборки.
1
|
|
|
Модератор
|
|||||||||||||
| 05.01.2024, 08:28 [ТС] | |||||||||||||
|
Условные пример:
Но тоже пока сомневаюсь: 1)Получается всё таки несколько громоздко; 2) Такой способ не подойдёт для ViewModelBase.
0
|
|||||||||||||
|
|
||
| 05.01.2024, 11:37 | ||
|
А если точнее то ещё чуть дальше. CommonUwp и CommonWpf - это ведь как раз тот "сервис" который - должен иметь общий интерфейс. В данном случае для метода RelayCommand - интегрирован в ViewModel (не CommonUwp.ViewModelBase или CommonWpf.ViewModelBase) а DI регистрация этой реализации должна выполняться разумеется в самом приложении, которое у вас и будет этим самым - UWP или WPF или XXX.
1
|
||
|
1167 / 885 / 517
Регистрация: 09.04.2014
Сообщений: 2,095
|
||||||
| 05.01.2024, 12:10 | ||||||
|
а почему бы не заставить пользователя правильно инициализировать библиотеку перед использовагием и не городить огород с автоматическим распознаванием типа приложения?
1
|
||||||
|
|
|||
| 05.01.2024, 12:55 | |||
|
Поэтому лучшее решение - по возможности максимально глубоко затащить использование под конкретную платформу в конкретный проект, где не нужны никакие ифы и определения платформ. Она уже знает кто она и вызовет только то что знает.
1
|
|||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||||||
| 05.01.2024, 14:03 | |||||||||
|
Наглядный пример — CommunityToolkit. ![]() Если серьезно, то слепая подписка на RequerySuggested — так себе затея. В мало-мальски сложном интерфейсе оно может привести к лагам, потому лучше оставить эту подписку на совести пользователя класса. В своем пакете YAMVVML.WPF можете поставлять реализацию CommandFactory, которая будет делать подписку с возможностью отказаться:
1
|
|||||||||
|
Модератор
|
|||
| 05.01.2024, 15:13 [ТС] | |||
|
Но CanExecute должен быть быстрым. В WPF ревалидация делается через подписку на CommandManager.RequerySuggested. В UWP, как я понял, даже без подписки, при изменениях в GUI автоматически ревалидируются все команды. Так что отсутствие подписки не означает что, на CanExecute можно вешать что угодно. Но пока нет для себя принятия решения - какой вариант реализации лучше. Цели конкурировать с распространёнными пакетами нет. Это скорее будет некий учебный проект на котором можно посмотреть работу "внутренностей". В том числе, продемонстрировать реализацию платноформонезависимых (Standard) Модели и ViewModel.
0
|
|||
|
Модератор
|
|||
| 05.01.2024, 15:25 [ТС] | |||
|
И подписка на CommandManager.RequerySuggested для WPF. Есть ещё немного по разному обращение к основному UI потоку. Но у меня пока нет решения насколько это нужно в слоях ниже View. Даже если делать подобное, то наверное нужно через внедрение контекста синхронизации, а не получения Диспетчера и т.п. классов. Больше отличий я пока не вижу. Но будут свойства, которые при желании, можно будет использовать и для других классов.
0
|
|||
|
Модератор
|
||
| 06.01.2024, 22:14 [ТС] | ||
|
С потоком может быть связан, вроде, только один контекст синхронизации SynchronizationContext.Current. Но у Форм это WindowsFormsSynchronizationContext, а у WPF DispatcherSynchronizationContext.
0
|
||
| 07.01.2024, 01:04 | |||
|
Не по теме:
Если для простого проекта вы уже добрались до SynchronizationContext, то это уже далеко не учебный проект. Уже напоминает рождение нового фреймворка.
0
|
|||
|
Модератор
|
|||
| 07.01.2024, 10:16 [ТС] | |||
|
Но во многом это учёба и для меня самого. Если делать под конкретный тип GUI то встанет вопрос внедрения в VM и Модель методов выполнения в основном потоке. Если делать эти методы универсальными, то оптимальнее всего использовать SynchronizationContext. Для приложений, в которых нет асинхронности, это, конечно, не нужна и является лишней обузой. Добавлено через 4 минуты HF, честно говоря, для меня до сих пор так и остаётся непонятным по какой причине реализация маршалинга сделана на всех платформах по разному. Например, в UWP что мешало добавить маршалинг INPC? Добавить этот маршалинг можно десятком строк, наверное. Ведь для INCC и команд он есть. Ладно, было бы как-то понятно, если бы не для чего не было. А тут какая-то половинчатая реализация. Добавлено через 5 минут То же самое в WPF. Проверку потока для CanExecuteChanged можно сделать пятью строчками. Что мешает их добавить в исходники? За CollectionChanged даже сказать не знаю что.... Она уже реализована - BindingOperations.EnableCollection. Всего лишь по умолчанию требуется включать её. И для 99.99% задач этого хватит. Её даже выключать потом не надо так как коллекция удерживается по слабой ссылке.
0
|
|||
| 07.01.2024, 10:16 | |
|
Помогаю со студенческими работами здесь
20
Как повторить кусок кода из WPF в Xamarin forms
Как определить в какой версии можно использовать тот или иной метод из UWP библиотеки?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Рецензия / Мнение/ Перевод
https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs
. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|