MonoDevelop: возможно ли сменить PCL-компилятор?
Мы начинаем кросс-платформенный проект, который будет развернут на Android и iOS. Очевидно, что много кода должно делиться между ними, а часть кода в значительной степени зависит от элементов платформы .NET, таких как библиотека sqlite-net.
Лучший способ (afaik) поделиться кодом между двумя проектами - использовать PCL - таким образом, можно ссылаться на проект с общим кодом из проектов iOS и Android в решении и все перекомпилировать и связанный в приятной манере.
Однако PCL, созданный в MonoDevelop, скомпилирован с компилятором gmcs, и в этом случае невозможно построить некоторые внешние зависимости (т.е. в используемом в этом случае фрейме System.Func<T, TResult>
, предоставляющем только System.Func<T1, T2, ..., T9, TResult>
). Компилятор MonoTouch (smcs), в свою очередь, способен скомпилировать PCL отлично (доказано заменой двоичного кода gmcs двоичным кодом smcs). Из того, что я нашел после нескольких поисковых запросов, gmcs использует 2.0.NET framework, в то время как smcs использует smth под названием 2.1 framework, которая на самом деле является срезанной смесью более поздних .NET.
Возникает вопрос: можно ли указать, какой компилятор использовать при построении PCL (как зависимости другого проекта) в MonoDevelop?
Ответы
Ответ 1
Моно еще не имеет реализации фактических библиотек PCL. На данный момент он имеет фиктивный файл Microsoft.Portable.CSharp.targets, который вместо этого переопределяет структуру и цели для создания библиотеки для MonoTouch, Mono для Android или .NET 4.0, в том порядке, в зависимости от того, что установлено.
Похоже на ошибку в кодедже, которая использует среду MonoTouch - она использует стандартные цели по умолчанию, Microsoft.CSharp.targets, без переопределения компилятора для использования в MonoTouch-версии компилятора С#. Это необходимо, потому что компилятор Mono С# в настоящее время является специфичным для платформы (хотя это исправлено в Mono 2.12, который находится в альфа-версии).
Возможно, вы сможете исправить это, отредактировав файл /Library/Frameworks/Mono.framework/Versions/Current/lib/mono/xbuild/Microsoft/Portable/v4.0/Microsoft.Portable.CSharp.targets
, найдя PropertyGroup, который устанавливает
<TargetFrameworkIdentifier>MonoTouch</TargetFrameworkIdentifier>
И к этому добавим строки:
<CscToolExe>smcs</CscToolExe>
<CscToolPath>/Developer/MonoTouch/usr/bin</CscToolPath>
Ответ 2
Я знаю, что это старый вопрос, но похоже, что поддержка Portable Class Library (PCL) была добавлена в Mono в версии 3.0.x, см. Release Примечания, в частности версия 3.0.8:
Добавлена поддержка PCL для реализации xbuild, monos MSBuild.