Подтвердить что ты не робот

Лучшие практики для портативных С#

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

Проект mono имеет несколько отличных porting ресурсов.

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

4b9b3361

Ответ 1

Я действительно использовал winforms, и все было в порядке. Это была БУТЬ УГЛИ, но она работала.

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

Ответ 2

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

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

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

Ответ 3

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

вместо:

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

делать:

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

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

Ответ 4

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

Помните:

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

L.E.: Кажется, что некоторые новые MacOSes больше не используют разделитель строк "\ r".

Ответ 5

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

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

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

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

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

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

Ответ 9

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