Лучшие практики для переносимого C#

Я хочу написать код C# для linux / windows / mac / любой другой платформы и ищу лучшие практики для переносимого кода.

У проекта мононуклеоз есть отличные ресурсы перенос.

Каковы лучшие практики для переносимого C#?

Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
20
0
2 952
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Не используйте Windows.Forms для графического интерфейса, но Mono, вероятно, уже упоминал об этом. Gtk # намного более согласован и надежен для кроссплатформенных графических интерфейсов.

Если вы хотите, чтобы код был переносимым, вам необходимо внимательно просмотреть список завершенных функций на сайте Mono. Они подробно описывают каждый класс в структуре и уровень полноты. Вам нужно будет принять это во внимание в процессе проектирования, чтобы не зайти слишком далеко и не обнаружить, что критически важная функция еще не реализована.

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

Я действительно использовал winforms, и это было нормально. Это было НО УЖАСНО, но сработало.

Очевидно, не используйте P / Invoke или какие-либо вещи win32, такие как реестр. Также помните о любых сторонних DLL. Например, мы используем стороннюю библиотеку SQLite, которая фактически содержит собственный код, который мы должны заменить, если мы хотим работать в OSX / Linux.

Жандарм и МоМА тоже могут помочь.

user7116 03.02.2009 20:36

Я ненавижу термин «Лучшая практика», потому что кажется, что некоторые методы могут быть лучшими в любом контексте, что является рискованным делом, но я расскажу, что я считаю «Хорошей практикой» для многоплатформенного кода (и для большинства другой тип развития):

Используйте механизм непрерывной интеграции и постоянно строить для всех целевых платформ.

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

Несколько лет назад я бы посоветовал вам купить себе копию моего книга на кроссплатформенной .NET, но, поскольку книга несколько устарела, вам действительно нужно придерживаться информации с сайта Mono.

Инструмент Моно-анализатор миграции (MoMA) очень хорош для анализа существующего приложения .NET и предупреждения о проблемах с переносимостью, но лучший вариант для нового кода - использовать последнюю стабильную версию Mono для разработки.

Как сказал Орион, вам нужно быть осторожным при использовании сторонних DLL, хотя мой соавтор написал инструмент NativeProbe для анализа библиотек DLL на предмет зависимостей P / Invoke, если вы действительно хотите быстро проверить стороннее программное обеспечение.

Если вы полны решимости разрабатывать на MS .NET, вам следует попробовать и убедиться, что вы также создаете и модульное тестирование на Mono, и вы также должны следить за рядом пространств имен Windows, таких как пространства имен Microsoft.Win32 и System.Management.

Есть и другие простые вещи. Например, не предполагайте символы пути. Или новые строки.

Я один из тех, кто регулярно компилирует NUnit на Mono под Linux или OSX.

Также не думайте, что компиляторы работают точно так же. Недавно мы обнаружили проблему, из-за которой компилятор MS C#, похоже, включает вещи, которых нет в Mono, и требует дополнительных ссылок в нашем сценарии сборки.

В остальном это было довольно просто. Я помню, как мы впервые получили графический интерфейс, работающий на Mono / Linux - это было довольно интересно (даже если был довольно некрасиво)

Остерегайтесь всего, что связано с манипуляциями с именами файлов и путями, и используйте переносимые методы .NET в System.IO.Path, т.е.

вместо:

string myfile = somepath + "\file.txt";

делать:

string myfile = Path.Combine(somepath, "file.txt");

Если вам нужно указать разделитель путей, вы должны использовать Путь. Разделитель и т. д.

Не используйте "\ r \ n" для новой строки. Используйте Environment.NewLine

Помните :

  • * NIX использует только символ новой строки ("\ n")
  • Windows использует "\ r \ n"
  • Макинтош использует "\ r" (я не совсем уверен в этом - не стесняйтесь поправлять меня).

Л.Э .: Похоже, что некоторые новые MacOS больше не используют разделитель строк "\ r".

Macintosh ИСПОЛЬЗУЕТСЯ для использования \ r. В наши дни он использует \ n, благодаря базе BSD. Не уверен, когда именно это изменилось. Хотя это все еще может быть проблемой.

Matthew Scharley 03.02.2009 04:53

Один недостающий элемент: убедитесь, что имена файлов чувствительны к регистру. File.Open ("MyFile.txt"); не будет работать в Unix, если ваш файл называется myfile.txt.

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