Xamarin.Mac 4.5 с компиляцией выпуска BCL Async не может разрешить System.Threading.Tasks

Я использую .NET 4.5 в Xamarin Studio с переносимыми библиотеками и проектом Xamarin.Mac. Если для проекта Xamarin.Mac установлено значение .NET 4.5, а Microsoft Async добавлен через nuget, компиляция в Debug завершится успешно, но в Release/AppStore произойдет сбой с

ошибка MM2002: не удалось разрешить сборку: «System.Threading.Tasks,

В этом случае нет необходимости добавлять библиотеки DLL (System.Threading.Tasks и System.Runtime) из BCL, поскольку они уже есть в .NET 4.5. Если вы переключитесь на .NET 4.0, он будет работать, но у меня уже есть много кода в .NET 4.5, который нельзя отменить из-за других зависимостей.

Почему-то BCL не распознает проект Xamarin.Mac .NET 4.5 как .NET 4.5 и по-прежнему требует DLL.

Чтобы воспроизвести:

  1. Создайте новый проект Xamarin.Mac.
  2. Установите его на .NET 4.5
  3. Используйте nuget для извлечения Microsoft Async (обратите внимание, что он не извлекает System.Threading.Tasks или System.Runtime).
  4. Переключиться на выпуск
  5. Компиляция

Как BCL узнает, используется ли .NET 4.0 или .NET 4.5? Может быть, я могу что-то объявить в csproj, чтобы он распознал, что System.Threading.Tasks (и System.Runtime) уже включены. Или, может быть, какая-то переменная среды? Или...?

Примечание. Можно ссылаться на System.Threading.Tasks и System.Runtime из папки nuget net40. И в тестовом проекте это действительно работает, хотя он жалуется на «Предопределенный тип System.Runtime.CompilerServices.AsyncStateMachineAttribute' is defined multiple times. Using definition frommscorlib.dll». Однако в моем случае у меня есть переносимая библиотека, которая использует EventArgs, и сборка завершается с ошибкой CS1684: ссылка на тип System.EventArgs' claims it is defined assemblySystem.Runtime - что, конечно, не так.


person tofutim    schedule 12.03.2014    source источник
comment
Зачем вам Microsoft Async? Сам Xamarin поддерживает асинхронное ожидание.   -  person Lex Li    schedule 13.03.2014
comment
Портативная библиотека требует этого -   -  person tofutim    schedule 13.03.2014


Ответы (1)


Я не уверен, насколько хорошо Xamarin.Mac поддерживает PCL. Вы можете попробовать добавить app.config с переадресацией привязки, аналогично тому, что описано здесь: http://motzcod.es/post/78863496592/portable-class-libraries-httpclient-so-happy

В противном случае я бы предложил зарегистрировать ошибку в Xamarin.

person Daniel Plaisted    schedule 12.03.2014
comment
Откуда BCL знает, когда запрашивать System.Threading.Tasks, а когда нет? Это, конечно, не нужно ни в этом, ни в привязке app.config при использовании BCL Async в проекте .NET 4.5 в Visual Studio. Я мог бы добавить перенаправление привязки, но это привело бы к проблеме с EventArgs, указанной выше. На самом деле дело в том, что проекту вообще не нужны эти dll, но он вынужден их иметь. - person tofutim; 13.03.2014
comment
Если я добавлю System.Threading.Tasks и System.Runtime из библиотеки net40 BCL, это будет иметь эффект указания только на них. Внезапно EventArgs в PCL, который находится в System.Runtime, больше не разрешается должным образом. - person tofutim; 13.03.2014
comment
@tofutim Папка lib/net45 в пакете Microsoft.Bcl NuGet пуста. Так пакет указывает, что эти ссылки не нужны в .NET 4.5. Xamarin.Mac использует другой идентификатор платформы, поэтому, вероятно, он выбирает одну из переносимых папок (которые, как известно NuGet, автоматически совместимы с платформами Xamarin). Простое удаление ссылок из проекта Xamarin.Mac может решить проблему. - person Daniel Plaisted; 13.03.2014
comment
Дэниел, я подозреваю, что это ошибка Xamarin.Mac в .NET 4.5. Я только что смог создать подобную ошибку без BCL. Буду держать вас в курсе. - person tofutim; 13.03.2014