Практический пример PCL. Как устранять проблемы, связанные с System.Diagnostics.Tracing для пакета NuGet потока данных библиотеки параллельных задач МайкрософтPCL case study: How can I resolve problems related to System.Diagnostics.Tracing for the Microsoft TPL Dataflow NuGet package?

Важно!

Данном конкретном примере из System.Diagnostic.Tracing больше не создает ошибок по умолчанию в последних версиях Xamarin.This particular example of System.Diagnostic.Tracing no longer produces any errors by default in the latest versions of Xamarin. Хотя предлагаемые обходной путь, по-прежнему будет работать, обратите внимание, что некоторые из ошибок, перечисленных в разделе «уровни ошибок» были исправлены.While the workaround suggested will still work, note that some of the bugs mentioned in the "layers of errors" section have been fixed. Кроме того следует отметить, что .NET Standard стала предпочтительным способом реализации кроссплатформенные API-интерфейсы .NET.Furthermore, you should note that .NET Standard is now the preferred way of implementing cross-platform .NET APIs.

СводкаSummary

Xamarin.iOS и Xamarin.Android не следует реализовывать каждый профиль PCL, они позволяют как ссылки на 100%.Xamarin.iOS and Xamarin.Android do not implement 100% of every PCL profile that they allow as references. Для практического удобства в Visual Studio для Mac, Visual Studio и диспетчер пакетов NuGet, проекты Xamarin позволяют использовать несколько профилей, которые имеют только неполные реализаций.For practical convenience in Visual Studio for Mac, Visual Studio, and the NuGet package manager, Xamarin projects allow the use of several profiles that only have incomplete implementations. Например, ни Xamarin.iOS и Xamarin.Android в настоящее время включает в себя полную реализацию типы в «System.Diagnostics.Tracing» переносимой библиотеки Классов пространства имен.For example, neither Xamarin.iOS nor Xamarin.Android currently includes a complete implementation of the types in the "System.Diagnostics.Tracing" PCL namespace. Это ограничение приводит к три уровня ошибок, при попытке использовать значение по умолчанию portable-net45+win8+wpa81 версию пакета NuGet потоков данных TPL Microsoft.This limitation leads to three layers of errors when trying to use the default portable-net45+win8+wpa81 version of the Microsoft TPL Dataflow NuGet package.

Решение Переключить проект приложения для ссылки на portable-net45+win8+wp8+wpa81 версию библиотеки потоков данных TPLWorkaround: Switch the app project to reference the portable-net45+win8+wp8+wpa81 version of the TPL Dataflow library

(Это позволяет избежать все три уровня ошибок и работает для всех последних версиях Xamarin.)(This avoids all three layers of errors and works for all recent versions of Xamarin.)

  1. Откройте проект приложения .csproj файл в текстовом редакторе.Open the application project .csproj file in a text editor.

  2. Найдите строку, которая выглядит примерно так:Find the line that looks similar to this:

    <HintPath>..\packages\Microsoft.Tpl.Dataflow.4.5.24\lib\portable-net45+win8+wpa81\System.Threading.Tasks.Dataflow.dll</HintPath>
    
  3. Изменение portable-net45+win8+wpa81 для portable-net45+win8+wp8+wpa81 (+wp8 добавляется):Change portable-net45+win8+wpa81 to portable-net45+win8+wp8+wpa81 (+wp8 is added):

    <HintPath>..\packages\System.Threading.Tasks.Dataflow.4.5.25\lib\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Dataflow.dll</HintPath>
    

ОбъяснениеExplanation

portable-net45+win8+wp8+wpa81 Не ссылается на версию библиотеки System.Diagnostics.Tracing.dll вообще, поэтому она полностью позволяет избежать все три уровня проблем.The portable-net45+win8+wp8+wpa81 version of the library does not reference System.Diagnostics.Tracing.dll at all, so it completely avoids all three layers of problems.

ОграниченияLimitations

  • portable-net45+win8+wp8+wpa81 Версии библиотеки могут не включать 100% функциональные возможности portable-net45+win8+wpa81 версии.The portable-net45+win8+wp8+wpa81 version of the library might not include 100% of the functionality of the portable-net45+win8+wpa81 version.

  • Диспетчер пакетов NuGet устанавливает portable-net45+win8+wpa81 версию пакета PCL NuGet по умолчанию, поэтому необходимо вручную изменить ссылки.The NuGet package manager installs the portable-net45+win8+wpa81 version of the PCL NuGet package by default, so you must adjust the reference by hand.

Сведения о трех уровнях ошибокDetails about the three layers of errors

  1. System.Diagnostics.Tracing.dll видимой сборкой является в настоящее время отсутствуют все версии Mac Xamarin.Android (закрытые ошибки 34888) и исключаются из всех версий Xamarin.iOS ниже, чем 9.0 (или ниже, чем XamarinVS 3.11.1443 в Windows) (устранена в ошибки 32388).The System.Diagnostics.Tracing.dll facade assembly is currently absent from all Mac versions of Xamarin.Android (non-public Bug 34888) and absent from all Xamarin.iOS versions lower than 9.0 (or lower than XamarinVS 3.11.1443 on Windows) (fixed in Bug 32388). Эту проблему вызывает один из следующих ошибок в зависимости от цели развертывания и компоновщик параметры:This problem will cause one of the following errors depending on deployment target and linker settings:

    • Xamarin.Android.Common.targets: Ошибка: Возникло исключение при загрузке сборки: System.IO.FileNotFoundException: Не удалось загрузить сборку "System.Diagnostics.Tracing, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a".Xamarin.Android.Common.targets: Error: Exception while loading assemblies: System.IO.FileNotFoundException: Could not load assembly 'System.Diagnostics.Tracing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. Возможно она не существует в Mono для Android профиля?Perhaps it doesn't exist in the Mono for Android profile?

    • Не удалось загрузить файл или сборку «System.Diagnostics.Tracing» или одну из ее зависимостей.Could not load file or assembly 'System.Diagnostics.Tracing' or one of its dependencies. Не удается найти указанный файл.The system cannot find the file specified. (System.IO.FileNotFoundException)(System.IO.FileNotFoundException)

    • MTOUCH: ошибка MT3001: Может не сборки AOT "/ Users/macuser/Projects/TPLDataflow/UnifiedSingleViewIphone1/obj/iPhone/Debug/mtouch-cache/64/Build/System.Threading.Tasks.Dataflow.dll"MTOUCH: error MT3001: Could not AOT the assembly '/Users/macuser/Projects/TPLDataflow/UnifiedSingleViewIphone1/obj/iPhone/Debug/mtouch-cache/64/Build/System.Threading.Tasks.Dataflow.dll'

    • MTOUCH: ошибка MT2002: Не удалось разрешить сборку: 'System.Diagnostics.Tracing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'MTOUCH: error MT2002: Failed to resolve assembly: 'System.Diagnostics.Tracing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

  2. Текущий реализацию Mono среды типы в «System.Diagnostics.Tracing» отсутствуют некоторые перегрузки метода (ошибки 27337).The current Mono implementation of the types in "System.Diagnostics.Tracing" is missing some method overloads (Bug 27337). Эта проблема приведет к одной из следующих ошибок компоновщика, при создании приложения Xamarin:This problem will cause one of the following linker errors when building a Xamarin app:

    • / Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets: ошибка: Ошибка при выполнении задачи LinkAssemblies: ошибка XA2006: Ссылка на метаданные элементов «System.Void System.Diagnostics.Tracing.EventSource::WriteEvent(System.Int32,System.Object[])» (определенный в "System.Threading.Tasks.Dataflow, Version = 4.5.24.0, язык и региональные параметры = neutral, PublicKeyToken = b03f5f7f11d50a3a") из "System.Threading.Tasks.Dataflow, Version = 4.5.24.0, язык и региональные параметры = neutral, PublicKeyToken = b03f5f7f11d50a3a" не удалось разрешить./Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets: error : Error executing task LinkAssemblies: error XA2006: Reference to metadata item 'System.Void System.Diagnostics.Tracing.EventSource::WriteEvent(System.Int32,System.Object[])' (defined in 'System.Threading.Tasks.Dataflow, Version=4.5.24.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a') from 'System.Threading.Tasks.Dataflow, Version=4.5.24.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' could not be resolved.

    • MTOUCH: ошибка MT2002: Не удалось разрешить ссылку «System.Void System.Diagnostics.Tracing.EventSource::WriteEvent(System.Int32,System.Object[])» из «System.Diagnostics.Tracing, Version = 4.0.0.0, язык и региональные параметры = neutral, PublicKeyToken = b03f5f7f11d50a3a»MTOUCH: error MT2002: Failed to resolve "System.Void System.Diagnostics.Tracing.EventSource::WriteEvent(System.Int32,System.Object[])" reference from "System.Diagnostics.Tracing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

  3. Текущий реализацию Mono среды типы в «System.Diagnostics.Tracing» настоящий момент также пустой «пустого» реализация (ошибки 34890).The current Mono implementation of the types in "System.Diagnostics.Tracing" is also currently an empty "dummy" implementation (Bug 34890). Таким образом, любая попытка использовать эти методы во время выполнения может дать непредвиденные результаты.Any attempt to use these methods at run time might therefore produce unexpected results. Для определенного случай библиотеки потоков данных TPL Microsoft, кажется, вызовы WriteEvent(System.Int32,System.Object[]) не нужны для большей части библиотеки поведение, поэтому исправление «уровня 2» (ошибки 27337, Добавление пустой реализации), скорее всего будет достаточно для большинства случаев использования потоков данных TPL Microsoft.For the particular case of the Microsoft TPL Dataflow Library, it seems the calls to WriteEvent(System.Int32,System.Object[]) are not essential for most of the library's behavior, so the fix for "layer 2" (Bug 27337, adding empty implementations) will likely be sufficient for most Microsoft TPL Dataflow use cases.

Вопросы и ответыQuestions & Answers

Я смог оставьте связывания, снабженный portable-net45+win8+wpa81 версии библиотеки на более старых версиях Xamarin.iOS или Xamarin.Android.I was able to leave linking enabled with the portable-net45+win8+wpa81 version of the library on older versions of Xamarin.iOS or on Xamarin.Android. Как сработало?How did that work?

ОтветAnswer

Это возможных по сборки для завершения «успешно» (с компоновки включено) в более старых версиях Xamarin.iOS или Xamarin.Android на компьютере Mac при включении ссылку System.Diagnostics.Tracing.dll ссылку на сборку [1] вместо видимой сборкой [2], но увы это делается не «правильный».It is possible to get the build to complete "successfully" (with linking enabled) in older versions of Xamarin.iOS or in Xamarin.Android on Mac if you include a reference to the System.Diagnostics.Tracing.dll reference assembly [1] rather than the facade assembly [2], but unfortunately this is not a "correct" workaround. Ссылочные сборки предназначены только для использования при построении переносимых библиотек, код не специфические для платформы, такими как приложения.Reference assemblies are only meant to be used when building portable libraries, not platform-specific code like apps. Попытка запуска кода, содержащегося в ссылочные сборки (а не только сборки, для ее), вероятнее всего будут давать непредвиденные результаты.Attempting to run the code contained in reference assemblies (rather than just build against it) is likely to produce unexpected results. Правильным решением будет Mono группой Добавьте отсутствующее WriteEvent(System.Int32,System.Object[]) перегруженная версия будет EventSource тип (ошибки 27337).The correct fix will be for the Mono team to add the missing WriteEvent(System.Int32,System.Object[]) overload to the EventSource type (Bug 27337). Для теперь лучше переключиться на portable-net45+win8+wp8+wpa81 версию библиотеки потоков данных TPL Microsoft, как описано в предыдущем разделе инструкции по решению.For now the best option is to switch to the portable-net45+win8+wp8+wpa81 version of the Microsoft TPL Dataflow library as discussed in the Workaround section above.

(Для всех, кто может прочитать эту статью, увидев связанных более старые, более компактно ответ в StackOverflow (https://stackoverflow.com/a/23591322/2561894), обратите внимание, что был различие между ссылочных сборок и видимой сборкой не упоминалось существует.)(For anyone who might be reading this article after seeing a related older, briefer answer from StackOverflow (https://stackoverflow.com/a/23591322/2561894), note that the distinction between reference assemblies and facade assembly was not mentioned there.)

[1] расположения «Ссылочные сборки»[1] "Reference assembly" locations

Windows: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.5\System.Diagnostics.Tracing.dllWindows: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.5\System.Diagnostics.Tracing.dll

Mac (Mono): /Library/Frameworks/Mono.framework/Versions/Current/lib/mono/xbuild-frameworks/.NETPortable/v4.5/System.Diagnostics.Tracing.dllMac (Mono): /Library/Frameworks/Mono.framework/Versions/Current/lib/mono/xbuild-frameworks/.NETPortable/v4.5/System.Diagnostics.Tracing.dll

[2] расположения «Facade сборок»[2] "Facade assembly" locations

Windows: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades\System.Diagnostics.Tracing.dllWindows: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades\System.Diagnostics.Tracing.dll

Mac (Mono): /Library/Frameworks/Mono.framework/Versions/Current/lib/mono/4.5/Facades/System.Diagnostics.Tracing.dllMac (Mono): /Library/Frameworks/Mono.framework/Versions/Current/lib/mono/4.5/Facades/System.Diagnostics.Tracing.dll

Он поможет, если вручную добавить ссылку на сборку фасадной «System.Diagnostics.Tracing»?Will it help if I manually add a reference to the "System.Diagnostics.Tracing" facade assembly?

В частности можно устранить проблему, используя 2 шага?In particular can I solve the problem using these 2 steps?

  1. Копировать System.Diagnostics.Tracing.dll видимой сборкой в папке проекта приложения из одного из следующих расположений:Copy the System.Diagnostics.Tracing.dll facade assembly into the application project folder from one of the following locations:

    Windows: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades\System.Diagnostics.Tracing.dllWindows: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades\System.Diagnostics.Tracing.dll

    Mac (Mono): /Library/Frameworks/Mono.framework/Versions/Current/lib/mono/4.5/Facades/System.Diagnostics.Tracing.dllMac (Mono): /Library/Frameworks/Mono.framework/Versions/Current/lib/mono/4.5/Facades/System.Diagnostics.Tracing.dll

  2. Добавьте ссылку на сборку фасадной в проекте приложения Xamarin.iOS или Xamarin.Android.Add a reference to the facade assembly in the Xamarin.iOS or Xamarin.Android application project.

ОтветAnswer

Нет, это не поможет.No, this will not help.

  • Для Xamarin.iOS 9.0 или любой текущей версии Xamarin.Android в Windows этот обходной путь является строго избыточным и может привести к ошибкам компиляции, аналогичную «сборка «System.Diagnostics.Tracing» с одинаковыми идентификаторами уже была импортирована.».For Xamarin.iOS 9.0 or any recent version of Xamarin.Android on Windows, this workaround is strictly redundant, and might cause compile errors similar to "An assembly `System.Diagnostics.Tracing' with the same identity has already been imported.".

  • Для Xamarin.iOS 8.10 или ниже или Xamarin.Android на компьютере Mac, поможет этого обходного пути, но только для сборки проблемы отсутствующих «уровень 1».For Xamarin.iOS 8.10 or lower or for Xamarin.Android on Mac, this workaround will help but only for the "layer 1" missing assembly problem. Он будет не решить ошибки компоновщика «уровень 2», поэтому не полное решение.It will not solve the "layer 2" linker errors, so it is not a complete solution.

Могу ли я использовать пакет System.Diagnostics.Tracing NuGet для решения проблемы?Can I use the System.Diagnostics.Tracing NuGet package to solve the problem?

ОтветAnswer

Нет, пакет NuGet 3.0 «System.Diagnostics.Tracing» включает только реализации платформы «DNXCore50» и «netcore50».No, the NuGet 3.0 "System.Diagnostics.Tracing" package only includes platform-specific implementations for "DNXCore50" and "netcore50". Он явно опускает реализации для Xamarin.Android («MonoAndroid») и Xamarin.iOS («MonoTouch» и «xamarinios»).It explicitly omits implementations for Xamarin.Android ("MonoAndroid") and Xamarin.iOS ("MonoTouch" and "xamarinios"). Это означает, что установка пакета будет иметь не влияет для проектов Xamarin.Android и Xamarin.iOS.This means that installing the package will have no effect for Xamarin.Android and Xamarin.iOS projects. Пакет NuGet предполагает, что оба этих платформ предоставляют свои собственные реализации типов.The NuGet package assumes that both of those platforms provide their own implementation of the types. Это предположение «правильный», в том смысле, что у моно реализации пространства имен, а также как описано в разделе точек #2 и #3 из «Сведения о трех уровней ошибок» выше, Реализация в настоящее время неполон.This assumption is "correct" in the sense that Mono does have an implementation of the namespace, but as discussed under points #2 and #3 of "Details about the three layers of errors" above, the implementation is currently incomplete. Поэтому для Mono команды для разрешения будут внесены соответствующие исправления ошибки 27337 и ошибки 34890.So the proper fix will be for the Mono team to resolve Bug 27337 and Bug 34890.

Следующие шагиNext Steps

Дополнительная помощь, свяжитесь с нами, или если эта проблема остается даже после использования указанные выше сведения, ознакомьтесь с разделом какие варианты поддержки доступны для Xamarin? сведения о параметрах связи, предложения, а также как файл новую ошибку, при необходимости.For further assistance, to contact us, or if this issue remains even after utilizing the above information, please see What support options are available for Xamarin? for information on contact options, suggestions, as well as how to file a new bug if needed.