PCL 사례 연구: Microsoft TPL 데이터 흐름 NuGet 패키지용 System.Diagnostics.Tracing과 관련된 문제를 해결하려면 어떻게 할까요?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은 이제 플랫폼 간 .NET Api를 구현 하는 데 선호 되는 방법입니다.Furthermore, you should note that .NET Standard is now the preferred way of implementing cross-platform .NET APIs.

요약Summary

Xamarin.ios 및 Xamarin은 참조로 허용 하는 모든 PCL 프로필의 100%를 구현 하지 않습니다.Xamarin.iOS and Xamarin.Android do not implement 100% of every PCL profile that they allow as references. Mac용 Visual Studio, 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.ios에는 현재 "System.web" PCL 네임 스페이스에 있는 형식의 완전 한 구현이 포함 되어 있지 않습니다.For example, neither Xamarin.iOS nor Xamarin.Android currently includes a complete implementation of the types in the "System.Diagnostics.Tracing" PCL namespace. 이러한 제한으로 인해 Microsoft TPL 데이터 흐름 NuGet 패키지의 기본 portable-net45+win8+wpa81 버전을 사용 하려고 할 때 세 가지 오류 계층이 발생 합니다.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.

해결 방법: TPL 데이터 흐름 라이브러리의 portable-net45+win8+wp8+wpa81 버전을 참조 하도록 앱 프로젝트를 전환 합니다.Workaround: 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+wpa81portable-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.object 를 참조 하지 않으므로 세 가지 문제 계층을 모두 방지 합니다.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 버전의 라이브러리에는 portable-net45+win8+wpa81 버전의 기능 중 100%가 포함 되지 않을 수 있습니다.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 패키지 관리자는 기본적으로 PCL NuGet 패키지의 portable-net45+win8+wpa81 버전을 설치 하므로 참조를 직접 조정 해야 합니다.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. XamarinVS 외관 어셈블리는 현재 xamarin의 모든 Mac 버전 (public이 아닌 버그 34888)에 없으며 9.0 보다 낮은 모든 xamarin.ios 버전 (또는 Windows의 3.11.1443 보다 낮음)에서 제외 됩니다 (다음에서 수정 됨). 버그 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.ios: 오류: 어셈블리를 로드 하는 동안 예외가 발생 했습니다. System.io.filenotfoundexception: 어셈블리 ' 4.0.0.0, Version =, Culture = 중립, 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'. Android 용 Mono 프로필에 존재 하지 않는 것 같습니다.Perhaps it doesn't exist in the Mono for Android profile?

    • 파일이 나 어셈블리 ' System.object ' 또는 해당 종속성 중 하나를 로드할 수 없습니다.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: error MT3001: '/Users/macuser/Projects/TPLDataflow/UnifiedSingleViewIphone1/obj/iPhone/Debug/mtouch-cache/64/Build/System.Threading.Tasks.Dataflow.dll ' 어셈블리를 AOT 수 없습니다.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: error MT2002: 어셈블리를 확인 하지 못했습니다. ' System.web, Version = 4.0.0.0, Culture = 중립, PublicKeyToken = b03f5f7f11d50a3a 'MTOUCH: error MT2002: Failed to resolve assembly: 'System.Diagnostics.Tracing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

  2. "System.web. 추적"에 있는 형식의 현재 Mono 구현 에 일부 메서드 오버 로드가 없습니다 (버그 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: 메타 데이터 항목 '::에 대 한 참조입니다. WriteEvent (system.string, System.object []) ' (' 4.5.24.0, Version =, Culture = 중립, PublicKeyToken = b03f5f7f11d50a3a ')에서 ', Version = 4.5.24.0, Culture = 중립, 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: error MT2002: ", Version = 4.0.0.0, Culture = 중립, PublicKeyToken =에서", WriteEvent (system.string, System.object []) "참조를 확인 하지 못했습니다. b03f5f7f11d50a3aMTOUCH: 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. "System.web. 추적"에 있는 형식의 현재 Mono 구현 도 현재 "더미" 구현 (버그 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. Microsoft TPL 데이터 흐름 라이브러리 의 경우에는 대부분 의 라이브러리 동작에 WriteEvent(System.Int32,System.Object[])를 호출 하는 것이 중요 하지 않을 수 있습니다. 따라서 "계층 2" (버그 27337, 빈 구현 추가)에 대 한 픽스는 대부분의 Microsoft TPL 데이터 흐름은 사례를 사용 합니다.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

이전 버전의 Xamarin.ios 또는 Xamarin.ios에서 라이브러리의 portable-net45+win8+wpa81 버전에 대 한 링크를 사용할 수 있습니다.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 또는 System.Diagnostics.Tracing.dll 참조] [어셈블리에 대 한 참조를 포함 하는 경우 Mac의 이전 버전에 대 한 빌드를 완료 하는 "성공" (연결 사용 )을 가져올 수 있습니다. 외관 어셈블리 [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). 지금은 위의 해결 방법 섹션에 설명 된 대로 Microsoft TPL 데이터 흐름 라이브러리의 portable-net45+win8+wp8+wpa81 버전으로 전환 하는 것이 가장 좋습니다.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.

관련 된 오래 된 항목을 확인 한 후이 문서를 읽을 수 있는 모든 사용자를 위해 보다 간단https://stackoverflow.com/a/23591322/2561894(StackOverflow)에서 답변을 확인할 수 있습니다. 참조 어셈블리와 외관 어셈블리 간의 차이점 은 다루지 않았습니다 .)(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] "외관 어셈블리" 위치[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

"시스템 진단" 외관 어셈블리에 대 한 참조를 수동으로 추가 하는 경우 도움이 되나요?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.

  • Windows에서 Xamarin.ios 9.0 또는 최신 버전의 Xamarin.ios의 경우이 해결 방법은 완전히 중복 되며, 동일한 id를 사용 하는 "어셈블리 ' 시스템에 대 한 컴파일 오류를 이미 가져왔습니다." 라는 오류가 발생할 수 있습니다.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.".

  • Mac에서 xamarin.ios 8.10이 하 또는 하위 Android의 경우이 해결 방법은 도움이 되지만 "계층 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.

진단 NuGet 패키지 를 사용 하 여 문제를 해결할 수 있나요?Can I use the System.Diagnostics.Tracing NuGet package to solve the problem?

대답할Answer

아니요, NuGet 3.0 "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.dialog" 및 "xamarinios")에 대 한 구현은 명시적으로 생략 됩니다.It explicitly omits implementations for Xamarin.Android ("MonoAndroid") and Xamarin.iOS ("MonoTouch" and "xamarinios"). 즉, 패키지를 설치 해도 Xamarin.ios 및 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. 이 가정은 Mono에 네임 스페이스의 구현이 있지만, 위에 ##설명 된 대로 "오류 계층에 대 한 세부 정보"에 대 한 세부 정보를 포함 하는 것과 같은 의미의 "수정"은 현재 불완전 한 구현입니다.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

추가 지원이 필요 하면 microsoft에 문의 하거나, 위의 정보를 사용한 후에도이 문제가 계속 발생 하는 경우 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.