Рекомендации для переносимого C # [закрыты]

StackOverflow https://stackoverflow.com/questions/42627

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Проект моно имеет несколько отличных перенос Ресурсы.

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

Это было полезно?

Решение

Я действительно использовал winforms, и это было прекрасно.Это было НЕКРАСИВО, но сработало.

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

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

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

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

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

Следите за всем, что связано с манипуляциями с именем файла и путем, и используйте переносимые .СЕТЕВЫЕ методы в System.IO.Путь т.е.

вместо того, чтобы:

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

делай:

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

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

Не используйте " " для новой строки.Использование Окружающая среда.Новая строка

Вспомни :

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

L.E.:Похоже, что некоторые новые macOS больше не используют разделитель строк " ".

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top