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>