MonoDevelop: можно ли переключить компилятор PCL?

мы начинаем кросс-платформенный проект для развертывания на Android и iOS. Очевидно, что между ними должно быть много кода, и некоторые из них в значительной степени зависят от элементов .NET framework, как это делает библиотека sqlite-net.

лучший способ (afaik) поделиться кодом между 2 проектами-использовать PCL – таким образом, можно ссылаться на проект с общим кодом из проектов iOS и Android в решении и все повторно скомпилировано и связано в хорошие манеры.

однако PCL, созданный в MonoDevelop, компилируется с компилятором gmcs, и некоторые из внешних зависимостей не могут быть построены в этом случае (т. е. структура, используемая в этом случае, не хватает System.Func<T, TResult>, предоставляя только System.Func<T1, T2, ..., T9, TResult>). Компилятор MonoTouch (smcs), в свою очередь, способен скомпилировать PCL отлично (доказано заменой двоичного файла gmcs на двоичный файл smcs). Из того, что я нашел после немного googling, gmcs использует 2.0 .NET framework, в то время как smcs использует smth под названием 2.1 framework, который на самом деле это нарезанная смесь более поздних .нетто.

здесь возникает вопрос: Можно ли указать, какой компилятор использовать при построении PCL (как зависимость другого проекта) в MonoDevelop?

2 ответов


Mono еще не имеет реализации фактических библиотек PCL. Сейчас он имеет фиктивный Microsoft.Портативный.Используется CSharp.файл мишени!--5--> это вместо этого переопределяет структуру и цели для создания библиотеки против MonoTouch, Mono для Android или .NET 4.0 в этом порядке, в зависимости от того, что установлено.

похоже, что в codepath есть ошибка, которая использует фреймворк MonoTouch - он использует общие цели по умолчанию, Microsoft.Используется CSharp.цели, без переопределение компилятора для использования специфичной для MonoTouch версии компилятора C#. Это необходимо, потому что компилятор C# Mono в настоящее время специфичен для фреймворка (хотя это исправлено в Mono 2.12, который находится в alpha).

вы можете исправить это, отредактировав файл /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>

Я знаю, что это старый вопрос, но похоже, что поддержка Portable Class Library (PCL) была добавлена в Mono в версии 3.0.X см. Заметки для деталей, в частности версии 3.0.8 :

добавлена поддержка PCL для xbuild, реализации MSBuild mono.