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.