Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
13 / 12 / 3
Регистрация: 07.09.2015
Сообщений: 261
1

Определить переменную на этапе компиляции (через msbuild)

21.09.2022, 06:50. Показов 809. Ответов 7

Author24 — интернет-сервис помощи студентам
Всем добрый день!

Подскажите есть ли, какая-нибудь техническая возможность динамически определеить значение переменной на этапе компиляции? То есть как-то передать параметр в msbuild, которые бы задало значение переменной?

Поясню.
Сейчас я делаю через директивы препроцессора, так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
#if Value1
 public static string ProductName="AppForOneUser"
#else
#If DEBUG
 public static string ProductName="ForTests
#else
#if Value2
 public static string ProductName="AppForTwoUser"
#endif
#endif
 
// И уже где-то в коде берётся значение из "ProductName"
// Например, заголовок окна Windows Forms.
Можно ли как-то избавиться от этих бесконечных if/else/endif
И просто через msbuild определить значение ProductName? (например где-нибудь в PropertyGroupe).
Типа, в консоле при сборке:
msbuild /t:Build /p:ProductName=AppForTwoUser
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.09.2022, 06:50
Ответы с готовыми решениями:

[msvc][msbuild] вывод сообщений на этапе построения
Всем привет. Использую msbuild. Сборка из командной строки. Сборка из под вижуал студии. ...

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

Как добавить анонимный тип в объект не на этапе компиляции, а на этапе выполнения программы? Надо для routes.MapRoute
В приложении ASP.NET MVC у меня есть xml файл с маршрутами типа: <route url="Home/{par1}/{par2}"...

Ключевое слово constexpr: как определить удалось ли вычислить возвращаемое значение на этапе компиляции?
https://habrahabr.ru/post/228181/ Как определить удалось ли вычислить возвращаемое значение на...

При компиляции показывается консоль MSBuild затем еще одна консоль и без результата
Когда я компилирую проект C# в Visual studio 2013 открывает MSBuild (консольку) и нечего не пишет...

7
Эксперт .NET
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,638
21.09.2022, 14:50 2
Schumacher57, может вам не директивы нужны, а файл конфигурации? Выглядит именно так.
1
13 / 12 / 3
Регистрация: 07.09.2015
Сообщений: 261
23.09.2022, 11:54  [ТС] 3
Usaga, Да, я смотрел в эту сторону. Тут же принцип работы какой. Программа на этапе компиляции считала все данные с файла конфигурации и загрузила в "себя", скажем так. А у меня вопрос кастомизации для конкретного пользователя. То есть мне то на этапе компиляции нужна одна и та же программа с двумя разными заголовками в названии (ну и не только заголовками они отличаются). Вот как для одного пользователя сделать такой заголовок и там картинки и оформление, а для друго-го другое... Файлом конфигурации? Там есть условные операторы? По-моему это просто тоже что и из какого-нибудь txt файла считывать данные.
0
Эксперт .NET
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,638
23.09.2022, 12:20 4
Цитата Сообщение от Schumacher57 Посмотреть сообщение
Файлом конфигурации?
Да. Совершенно нормальное решение. И по времени БЫСТРЕЕ, чем делать 100500 сборок разных.

Цитата Сообщение от Schumacher57 Посмотреть сообщение
Там есть условные операторы?
Где?

Цитата Сообщение от Schumacher57 Посмотреть сообщение
По-моему это просто тоже что и из какого-нибудь txt файла считывать данные.
Ну, оно и есть.
0
13 / 12 / 3
Регистрация: 07.09.2015
Сообщений: 261
28.09.2022, 17:45  [ТС] 5
Usaga, Ну ок. Максимально приближенный пример к реальности.

Вот есть приложение которое считает график работы для компании "Вим-биль-пупок". Человек открывает это приложение и в заголовке написано: "Программа расчёта графика работы для компании "Вим-биль-пупок".
Потом есть такой же график расчёта для компании "KrakodgiaAirlains". И там человек когда запускает программу, написано: "Программа расчёта графика работы для компании "KrakodgiaAirlains". То есть у оператора ПК создаётся впечатление, что эта программа написана специально для него.
И вот таких компаний около 20 штук. И каждая компания хочет чтобы у них в приложении было именно своё название. А не "Программа расчёта графика работы для всех желающих по принципу усреднения". И тут нюанс, не только название, но и цветовые оттенки.

Как я решил задачу:
Есть утилита – msbuild. Можно собрать проект на C# через консоль.
Команда выглядит вот так:
msbuild /p:Configuration=KrakodgiaAirlains /t:Release
Что примерно означает следующее, собрать сборку для компании "KrakodgiaAirlains" (определить свойство Configuration равное KrakodgiaAirlains), цель сборки – Release.
Дальше в файле проекта .csproj написано, если свойство (property) равно "KrakodgiaAirlains", то использоваться такие-то файлы ресурсов и определить такие-то DefineConstants.
Вот если с ресурсами всё чётко, то в DefineConstants и есть вся загвостка.
В коде C# я сделал такое условие:
Если определена переменная препроцессора: "KrakodgiaAirlains" Пример кода:
C#
1
2
3
4
#If KrakodgiaAirlains
   public static string ProductName=Программа расчёта графика работы для компании "KrakodgiaAirlains"
#else
...
И вот хорошо когда таких условий 5. А когда таких условий 25 уже код не четабелен.
Вот и вопрос как эффективно кастомизировать сборки по сути одной и той же программы, под разных заказчиков?
0
Эксперт .NET
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,638
29.09.2022, 06:26 6
Цитата Сообщение от Schumacher57 Посмотреть сообщение
Вот и вопрос как эффективно кастомизировать сборки по сути одной и той же программы, под разных заказчиков?
Настройкой в файле конфигурации. Без всяких директив компиляции. Ваше приложение при старте будет читать эти настройки, где название, цвета, всё такое и применять их. Тогда у вас не будет 25 условий каких-то и необходимости каждый раз приложение пересобирать 25 раз на каждый чих.

Это совершенно нормальная и распространённая практика.
0
13 / 12 / 3
Регистрация: 07.09.2015
Сообщений: 261
06.10.2022, 11:46  [ТС] 7
Usaga, сначала хочу сказать, спасибо за ответы!

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

Цитата Сообщение от Usaga Посмотреть сообщение
Настройкой в файле конфигурации. Без всяких директив компиляции.
То есть эта реализация представлена, как пример, следующими ключевыми моментами:
1. Сборку проекта (на С#) осуществляется через msbuild;
2. В консоле (bat файле) ты указываешь какой файл конфигурации (по сути xml документ) подгрузить для сборки этого проекта.
3. Для каждой кастомизации (цвета, наименования и т.п.) создаётся свой файл конфигурации.
4. Соответственно в файле проекта (.csproj) будут условные операторы, которые в зависимости от переданного через команду из cmd значения (напр. property), будут подгружать нужный файл конфигурации (xml) в проект.

Верно ли я (пусть примерно) понял процесс реализации кастомизации через файлы конфигурации?

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
Тогда у вас не будет 25 условий каких-то
И насчёт вот этого не совсем представляю, как обойтись сборкой без условий. Не всегда же надо пересобрать обязательно все 25 разных кастомов. А если например нужно пересобрать только 3-7 кастома (персонализированных приложений) из 25 и обойтись без условий мне кажется невозможным.
0
Эксперт .NET
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,638
06.10.2022, 16:03 8
Цитата Сообщение от Schumacher57 Посмотреть сообщение
1. Сборку проекта (на С#) осуществляется через msbuild;
Чисто технически, она ВСЕГДА идёт через msbuild. Visual Studio и утилита dotnet пинают msbuild для сборки.

Цитата Сообщение от Schumacher57 Посмотреть сообщение
2. В консоле (bat файле) ты указываешь какой файл конфигурации (по сути xml документ) подгрузить для сборки этого проекта.
3. Для каждой кастомизации (цвета, наименования и т.п.) создаётся свой файл конфигурации.
4. Соответственно в файле проекта (.csproj) будут условные операторы, которые в зависимости от переданного через команду из cmd значения (напр. property), будут подгружать нужный файл конфигурации (xml) в проект.
Сборка вашего проекта однократная. Чтение конфигурации ваше приложение производит во время исполнения. В это время уже никаких csproj нет. Когда и как вы конфиг будете подкладывать вы уже исходите из своих требований.

Как это делаем мы. У нас более 300 спартанцев клиентов. Но сборка для всех ОДНА. Инсталлер, во время установки, требует предзаполнить специфичные данные и сохраняет их в реестре (чтобы в следующий раз заново не вводить). И во время установки редактирует конфиг и заполняет нужными данными.

Т.е. кастомер (заказчик, клиент) сам себе всё настраивает. Нет у нас никаких условий сборки.

Цитата Сообщение от Schumacher57 Посмотреть сообщение
И насчёт вот этого не совсем представляю, как обойтись сборкой без условий. Не всегда же надо пересобрать обязательно все 25 разных кастомов. А если например нужно пересобрать только 3-7 кастома (персонализированных приложений) из 25 и обойтись без условий мне кажется невозможным.
Если вы настройки будете читать во время выполнения, то вообще никаких пересборок и кастомов не будет. Ни одного.
0
06.10.2022, 16:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2022, 16:03
Помогаю со студенческими работами здесь

C++14: вычисления на этапе компиляции
Добрый день. Есть такой код:struct Qaz { constexpr Qaz(uint8_t index) : _index(index) {} ...

Ошибка на этапе компиляции
Добрый вечер. Ребят помогите, не могу понять в чем дело. Есть программа в которой описан 1 класс...

Ошибка на этапе компиляции
в чём может быть проблема?

Чтение файла на этапе компиляции
Можно ли считать файл настроек на этапе компиляции? Нужно что бы выбросить код который в рантайме...

Несистематическая ошибка на этапе компиляции
#pragma hdrstop #pragma argsused #include <iostream.h> void main() { double a; int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru