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

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


person Frep D-Oronge    schedule 30.11.2008    source источник


Ответы (2)


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

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

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

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

bool runningOnMono = Type.GetType ("Mono.Runtime") != null;
person Will Dean    schedule 30.11.2008
comment
@Will Dean Иногда вам нужно использовать условные компиляции. Например. Mono не поддерживает атрибут; ViewStateModeById, который вызывает сбой во время выполнения, если вы пометили им класс. Так что то, что вы говорите, не совсем верно... - person Thomas Hansen; 30.11.2008
comment
Я не знаком с этим атрибутом, но мне все же кажется, что будущее присутствие или отсутствие атрибута ViewStateModeById не является чем-то, что напрямую коррелирует с компилятором, который использовался для компиляции ваших сборок. Но всегда есть MonoCS, если это так... - person Will Dean; 30.11.2008
comment
@Will Это вызовет сбой во время выполнения при попытке загрузить сборку... :( Но в целом я с вами согласен, хотя это не всегда возможно... - person Thomas Hansen; 30.11.2008
comment
Поймите, но Mono местами многое наверстывает, и нет смысла наказывать сборку MS... Хороший совет, спасибо. - person Frep D-Oronge; 02.12.2008
comment
Одним из вариантов использования является наличие графического интерфейса GTK# в Mono и графического интерфейса Windows.Forms в .Net. - person Ivan Vučica; 01.03.2011
comment
Уилл - проблема, с которой я столкнулся, заключалась в поведении WinForms BindingSources, привязанного к объектам, реализующим INotifyPropertyChanged. Очевидно, это было некоторое время назад, и, возможно, сейчас все в порядке. - person Frep D-Oronge; 10.02.2012
comment
Если вы используете развертывание одним щелчком мыши и у вас есть глобальный обработчик ошибок, который получает информацию одним щелчком мыши из System.Deployment, в противном случае вам придется условно скомпилировать. - person Chris Pfohl; 28.09.2012
comment
Иногда необходимо использовать макрос, так как Mono не сможет скомпилировать то, что отлично компилируется в Windows. Например: AppDomain.CurrentDomain.FirstChanceException просто не определено в Mono. - person Sergiy Belozorov; 24.03.2014
comment
НО НО НО не весь смысл Mono в том, что вы можете взять сборку, созданную с помощью VS, и запустить ее в Mono или наоборот. Это зависит от платформы.... как насчет продуктов Xamarins для Mac и мобильных устройств??? они изобрели моно и они этого не делают. Так что вы явно неправы. Хотя это работает, иногда это не работает с другими. - person AnthonyLambert; 26.01.2015
comment
@AnthonyLambert - Посмотрите на дату моего ответа - он был написан еще до того, как Xamarin существовал. - person Will Dean; 26.01.2015
comment
Вау, ты прав... время не летит.... в любом случае все меняется, и если оставить все как есть, это вводит в заблуждение и неправильно для сегодняшней аудитории. - person AnthonyLambert; 26.01.2015
comment
Я хочу скомпилировать код в Mono, который использует сборку, которой нет в Mono using System.Deployment.Application; — это не может работать во время выполнения, потому что оператор using не компилируется в Mono. С переключателем компиляции я могу это сделать. - person PandaWood; 06.08.2018

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

Например:

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

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

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

person AnthonyLambert    schedule 01.06.2012
comment
В .NET уже есть абстракции для переносимой обработки путей. System.IO.Path.DirectorySeparatorChar, например. Таким образом, нет необходимости создавать собственную логику для обработки различных возможностей ОС в этом случае. - person Nate C-K; 23.01.2015