Я использую .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.
Чтобы воспроизвести:
- Создайте новый проект Xamarin.Mac.
- Установите его на .NET 4.5
- Используйте nuget для извлечения Microsoft Async (обратите внимание, что он не извлекает System.Threading.Tasks или System.Runtime).
- Переключиться на выпуск
- Компиляция
Как 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 from
mscorlib.dll». Однако в моем случае у меня есть переносимая библиотека, которая использует EventArgs, и сборка завершается с ошибкой CS1684: ссылка на тип System.EventArgs' claims it is defined assembly
System.Runtime - что, конечно, не так.