Как я могу условно скомпилировать мой C# для Mono и Microsoft .NET?

Мне нужен переключатель условной компиляции, который знает, компилирую ли я для среды выполнения mono или MS .NET. Как я могу это сделать?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
34
0
5 501
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Компилятор Mono определяет __MonoCS__

НО НО НО, весь смысл Mono в том, что вы можете взять сборку, созданную с помощью VS, и запустить ее в Mono, или наоборот.

Мне кажется, что если вам нужно иметь различия между Mono и MS.NET, тогда вам нужно принимать эти решения во время выполнения.

Стандартный способ обнаружения Mono во время выполнения:

bool runningOnMono = Type.GetType ("Mono.Runtime") != null;

Поймите суть дела, но у Mono есть чем наверстать упущенное, и нет смысла наказывать сборку MS ... Хороший совет, хотя спасибо

Frep D-Oronge 02.12.2008 14:18

Одним из вариантов использования является графический интерфейс GTK # в Mono и графический интерфейс Windows.Forms в .Net.

Ivan Vučica 01.03.2011 23:26

Будет - проблема, с которой я столкнулся, заключалась в поведении WinForms BindingSources, привязанных к объектам, реализующим INotifyPropertyChanged. Очевидно, это было некоторое время назад, и, может быть, сейчас все в порядке.

Frep D-Oronge 10.02.2012 14:45

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

Chris Pfohl 28.09.2012 20:31

Иногда необходимо использовать макрос, поскольку Mono не сможет скомпилировать то, что хорошо компилируется в Windows. Например: AppDomain.CurrentDomain.FirstChanceException просто не определен в Mono.

Sergiy Belozorov 24.03.2014 23:30

@Will Dean Иногда вам нужно использовать условные компиляции. Например. Mono не поддерживает атрибут; ViewStateModeById, который вызывает сбой во время выполнения, если вы пометили им класс. То, что вы говорите, не совсем верно ...

Thomas Hansen 30.11.2008 20:15

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

Will Dean 30.11.2008 21:07

@Will Это вызовет сбой во время выполнения при попытке загрузить сборку ... :( Но в целом я согласен с вами, хотя это не всегда возможно ...

Thomas Hansen 30.11.2008 21:46

НО НО НО суть Mono не в том, что вы можете взять сборку, созданную с помощью VS, и запустить ее в Mono, или наоборот. Это зависит от платформы .... как насчет продуктов Xamarins для Mac и мобильных ??? они изобрели моно, и они этого не делают. Значит, вы явно ошибаетесь. Иногда это работает, но с другими не работает.

AnthonyLambert 26.01.2015 13:50

@AnthonyLambert - Посмотрите на дату моего ответа - он был написан еще до того, как появился Xamarin.

Will Dean 26.01.2015 16:13

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

AnthonyLambert 26.01.2015 18:45

Я хочу скомпилировать код в Mono, который использует сборку, которой нет в Mono using System.Deployment.Application; - это не может работать во время выполнения, потому что оператор using не компилируется в Mono. С переключателем компиляции я могу это сделать.

PandaWood 06.08.2018 16:01

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

Например:

Mono используется в качестве основы для наборов инструментов Xamarin для iOS, Android и Mac. Хотя у них много общего кода, у них также есть классы, которые появляются только на одной платформе. При разработке с помощью этих наборов инструментов вы разрабатываете собственные пакеты, которые не подлежат обмену между платформами.

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

Было бы неплохо, если бы был небольшой фрагмент кода, который возвращал бы текущую платформу - будь то UNIX, iOS, Mac, X86, X64, XBox и т. д.

В .NET уже есть абстракции для переносимой обработки путей. System.IO.Path.DirectorySeparatorChar, например. Таким образом, нет необходимости создавать собственную логику для обработки различных возможностей ОС в этом случае.

Nate C-K 23.01.2015 19:54

Другие вопросы по теме