1

Я создал пакет NuGet для моего Simple.OData.Client с поддержкой Xamarin Android и iOS. Эта библиотека использует Microsoft.Bcl.Async. Тесты с использованием Android и IOS симулятор прошло нормально, но когда я установить этот новый пакет NuGet в другой проект, он не компилировать Droid/Сенсорный проектов со следующим сообщением:Microsoft.Threading.Tasks.Extensions в проектах Xamarin Mono

C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(720,2): error : Exception while loading assemblies: System.IO.FileNotFoundException: Could not load assembly 'Microsoft.Threading.Tasks.Extensions, Version=1.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. Perhaps it doesn't exist in the Mono for Android profile? 
C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(720,2): error : File name: 'Microsoft.Threading.Tasks.Extensions.dll' 

Конечно нет Microsoft.Bcl. Async-пакет (пока) для платформ Mono, с другой стороны, поскольку тесты библиотеки проходят на этих платформах, я предполагаю, что это скорее задача сделать Visual Studio счастливой, а не сделать некоторую модификацию кода.

Кто-нибудь мог использовать на Mono PCL в зависимости от Microsoft.Bcl.Async?

ответ

1

Как правило, если код в вашем пакете зависит от другого пакета NuGet, вам необходимо объявить зависимость пакета, чтобы каждый, кто установил ваш пакет, получал тот, на который вы тоже зависите. Это должно позаботиться о таких проблемах.

Однако в этом случае это намного сложнее. Поскольку Microsoft.Bcl.Async не поддерживает платформы Mono, вы не можете объявить эту зависимость пакета (или если вы это сделали, это всегда будет невозможно установить). К сожалению, лицензия на Microsoft.Bcl.Async ограничивает ее на «платформы Windows». Я не юрист, но я думаю, это означает, что вы не должны распространять Microsoft.Threading.Tasks.Extensions.dll как часть своего пакета. Наконец, официальной поддержки PCL для платформ Mono пока нет, поэтому, если вы придумаете решение, которое теперь работает, оно может измениться, когда появится официальная поддержка PCL.

Если вы хотите попытаться заставить это работать, вам в основном нужно создать собственные библиотеки DLL с теми же именами, что и в Microsoft.Bcl и Microsoft.Bcl.Async для использования на платформах Mono. В этих сборках поместите тип вперед для типов, которые Mono уже реализует (что, вероятно, должно быть типами в DLL-системах System. *), И создайте собственную реализацию для других (исходный код AsyncBridge для этого полезен) , Это то, что я сделал для одной из моих демоверсий BUILD 2012 PCL. Код для этого - here. AsyncFacades и AsyncBridge - соответствующие проекты.

+0

Я вижу, я, безусловно, избегайте проблем с юристами :-) Я посмотрел на ваши образцы, я вижу, что вы переадресовали некоторые типы в AsyncFacades, но определили некоторые интерфейсы. Что является причиной этого? Я видел прошивку System.Net, и у нее была только пересылка типов. Как насчет подписания? Предположим, я должен подписать Tasks.Extensions.dll для платформ Mono, когда я должен получить файл ключа? –

+0

@VagifAbilov Интерфейсы были, вероятно, теми, которых не было на Mono, поэтому им нечего было вводить.Для подписания вам нужно задержать подписку сборок, как описано здесь: http://stackoverflow.com/a/13032213/1509 –

0

Я считаю, что я нашел проблему.

Ранее я имел следующую строку в Simple.OData.Client nuspec файле:

<file src="Simple.OData.Client.Core\bin\Release\Microsoft.Threading.Tasks.Extensions.dll" target="lib\portable-net403+win8+sl5+wp8+MonoAndroid16+MonoTouch40\Microsoft.Threading.Tasks.Extensions.dll" /> 

Это не так, как это должно быть, потому что Microsoft.Bcl.Async должны позаботиться о копировании Tasks.Extensions.dll , Я сообщил об этом Microsoft и предположил, что это будет исправлено в RTM-версии Microsoft.Bcl.Async. По-видимому, этого не было, поэтому все пакеты NuGet, зависящие от Microsoft.Bcl.Async, должны копировать этот файл. Тогда это сработает.

1

Для тех, спотыкаясь в этом вопросе при получении Simple.oData.Client от NuGet, просто установите следующие пакеты из NuGet:

Microsoft Bcl Асинхронный Portable Microsoft Bcl Async

+0

Спасибо, я только что получил сообщение об ошибке. Попробуем это проверить. –

Смежные вопросы