Я ищу для написания кода С# для linux/windows/mac/любой другой платформы, и я ищу лучшие методы для переносимого кода.
Проект mono имеет несколько отличных porting ресурсов.
Каковы наилучшие методы для переносимого С#?
Я ищу для написания кода С# для linux/windows/mac/любой другой платформы, и я ищу лучшие методы для переносимого кода.
Проект mono имеет несколько отличных porting ресурсов.
Каковы наилучшие методы для переносимого С#?
Я действительно использовал winforms, и все было в порядке. Это была БУТЬ УГЛИ, но она работала.
Очевидно, не используйте P/Invoke или любые элементы win32, такие как реестр. Также имейте в виду любые сторонние DLL. Например, мы используем стороннюю SQLite dll, которая на самом деле содержит в себе собственный код, который мы должны поменять, если мы хотим работать на OSX/linux.
Я ненавижу термин "лучшая практика", потому что кажется, что некоторые практики могут быть лучшими в любом контексте, что является рискованным делом, но я расскажу, что я считаю "хорошей практикой" для многоплатформенного кода ( и для большинства других типов разработки):
Использовать механизм непрерывной интеграции и строить для всех целевых платформ все время.
Звучит слишком сложно? Ну, если вам действительно нужно поддерживать несколько платформ, лучше это сделать. Независимо от того, насколько вы осторожны с вашим кодом и использованием библиотеки, если вы испытываете слишком поздно, вы обнаружите, что тратите долгие часы на переработку больших частей приложения.
Следите за тем, что связано с именами файлов и манипуляциями с ними, и используйте переносимые методы .NET в System.IO.Path, т.е.
вместо:
string myfile = somepath + "\\file.txt";
делать:
string myfile = Path.Combine(somepath, "file.txt");
Если вам нужно указать разделитель путей, вы должны использовать Path.Separator и т.д.
Не используйте "\ r\n" для новой строки. Используйте Environment.NewLine
Помните:
L.E.: Кажется, что некоторые новые MacOSes больше не используют разделитель строк "\ r".
Не используйте Windows.Forms для GUI, но Mono, вероятно, уже упоминал об этом. Gtk # гораздо более последователен и надежен для графических интерфейсов с кросс-платформой.
Несколько лет назад я бы посоветовал вам купить себе копию 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.
Если вы хотите, чтобы код был портативным, вам необходимо внимательно ознакомиться со списком завершенных функций на сайте Mono. Они подробно описывают каждый класс в рамках и уровень полноты. Вы должны будете учитывать это во время процесса проектирования, чтобы не заходить слишком далеко по пути и обнаружить, что критическая функция еще не реализована.
Есть и другие простые вещи. Например, не предполагайте символы пути. Или новые строки.
Я один из тех, кто регулярно компилирует NUnit в Mono на Linux или OSX.
Кроме того, не предполагайте, что компиляторы работают точно так же. Недавно мы обнаружили проблему, когда компилятор MS С#, похоже, включает в себя то, что Mono не делает, требуя дополнительных ссылок в нашей сборке script.
Кроме этого, это было довольно просто. Я помню, как в первый раз мы получили графический интерфейс, работающий на Mono/Linux - это было довольно интересно (даже если это было довольно уродливо)
Один отсутствующий элемент: убедитесь, что имена файлов чувствительны к регистру. File.Open( "MyFile.txt" ); не будет работать в Unix, если ваш файл имеет имя myfile.txt.