Рекомендации по перекрестной компиляции .NET/MONO
Каковы наилучшие методы написания кода, который можно скомпилировать на .NET(windows) и Mono (linux)? Хотя я очень хорошо знаком с .NET, я не настолько опытен в Mono и все его gotchas. Кто-нибудь видел хорошую запись в блоге или рекомендации по этому поводу, которые я не смог выкопать? Я буду придерживаться функций уровня С# 3.0.
Вещи, которые меня интересуют, это прежде всего Interop, так как мне нужно будет вызвать собственный код.
Далее были бы лучшие способы обработки пространств имен, таких как Mono.XXX. Должен ли я использовать кучу #if? Изолировать код в каждой платформе?
Любые предложения по архитектуре и дизайну будут очень признательны!
Если у вас есть опыт перекрестной компиляции для Linux/Mono в visual studio (любая версия), мне также было бы интересно.
Ответы
Ответ 1
Самые большие проблемы - придерживаться поддерживаемых Mono API. Использование Поддержка Visual Studio Integration в Mono может многое помочь с этим, поскольку вы можете настраивать Mono все время на всех платформах.
По вашим конкретным вопросам:
1) Interop - вам нужно будет придерживаться P/Invoke. Попытайтесь изолировать это в отдельные сборные платформы. Это приводит к 2:
2) Используя #if - я бы избегал этого и предпочитаю использовать модель расширяемости. Mono поддерживает Managed Extensibility Framework, который обеспечивает хороший способ "подключить" к определенному коду платформы во время выполнения.
Ответ 2
Вам следует пересмотреть Prebuild:
Prebuild - это кросс-платформенный инструмент для предварительной сборки на основе XML, который позволяет разработчикам легко создавать файлы проектов для основных средств разработки среды разработки и разработки .NET, включая: Visual Studio.NET 2002, 2003, 2005, SharpDevelop, MonoDevelop, NAnt и Autotools.
Ответ 3
Отъезд Монографический анализатор
Ответ 4
Проект Mono предоставляет документ с рекомендациями по переносимости. Это очень хорошее место для начала.
Ответ 5
Мы используем MonoDevelop и Visual Studio для разработки, но какой ключ должен поддерживать хорошая сборка NAnt script для создания всего объекта на одном снимке (правила Joel Spolsky).
Основная проблема IMO заключается в том, чтобы четко заявить, что программное обеспечение должно быть кросс-платформенным, поэтому речь идет не о "переносе на linux/mono", а в разработке каждой итерации на требуемых платформах.
Нам пришлось избегать некоторых функций в начале (используя Mono/.NET в течение 5 лет для коммерческого продукта), и мы по-прежнему придерживаемся .NET Remoting, но это не очень важно для многоплатформенной разработки, на мой взгляд.
Подсчет на мягкий отладчик, так как почти один год тоже замечательный.