From 92f0e768550b591ec7a499160e0d28de8bcb63a1 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Tue, 24 Mar 2015 07:08:00 -0700 Subject: [PATCH] Initial commit. --- .gitattributes | 63 + .gitignore | 190 +++ Documentation/3_Threading_Rules.md | 280 +++++ ...d_a_source_item_with_specific_item_type.md | 29 + Documentation/Analyze_Hangs.md | 3 + .../Appropriately_schedule_async_tasks.md | 24 + Documentation/Async_hang_debugging.md | 153 +++ .../Automatic_DependentUpon_wireup.md | 77 ++ .../BlockDefer_critical_project_operations.md | 23 + ...dd_custom_tabs_to_the_Reference_Manager.md | 10 + Documentation/CPS_Core_vs._CPS_VS.md | 79 ++ Documentation/Clients_Automation.md | 3 + Documentation/Clipboard.md | 5 + Documentation/Command_handlers.md | 63 + Documentation/Contentitem_types.md | 77 ++ Documentation/CookBook.md | 206 ++++ Documentation/Custom_Debugger.md | 20 + Documentation/Custom_item_types.md | 111 ++ Documentation/Custom_reference_types.md | 76 ++ Documentation/Early_Drafts.md | 3 + Documentation/Extensibility_points.md | 87 ++ Documentation/External_customer_guidance.md | 80 ++ Documentation/Finding_CPS_in_a_VS_project.md | 122 ++ .../GetMkDocument_returns_12_style_strings.md | 25 + Documentation/HOWTOs.md | 3 + ...he_tabs_in_the_Reference_Manager_Dialog.md | 21 + .../How_to_add_a_fast_uptodate_check.md | 6 + ...w_to_create_a_new_CPSbased_project_type.md | 63 + ...tect_whether_a_project_is_a_CPS_project.md | 24 + .../IFileSystemErrorMessageProvider.md | 12 + Documentation/IProfilableProjectProvider.md | 19 + Documentation/IProjectPropertiesProvider.md | 14 + .../IProjectSourceItemProviderExtension.md | 33 + Documentation/IProjectTreeModifier.md | 18 + Documentation/IProjectTreeProvider.md | 3 + Documentation/IPublishProvider.md | 61 + .../IValidProjectReferenceChecker.md | 3 + Documentation/Images/Fig.png | Bin 0 -> 112055 bytes Documentation/Images/Fig_2.png | Bin 0 -> 29984 bytes Documentation/Images/Fig_3.png | Bin 0 -> 35197 bytes Documentation/Images/Fig_4.png | Bin 0 -> 11778 bytes Documentation/Images/Fig_5.png | Bin 0 -> 30972 bytes ...rfaces_NOT_defined_on_IVsProject_object.md | 21 + ...Interfaces_defined_on_IVsProject_object.md | 61 + ...Introduction_to_new_project_from_wizard.md | 34 + ...ntroductory_Note_to_CPS_candidate_users.md | 97 ++ .../IsDocumentInProject_extensibility.md | 8 + Documentation/ItemIDs.md | 116 ++ Documentation/MEF.md | 225 ++++ .../New_capabilities_for_item_templates.md | 39 + ...ation_for_async_project_load_completion.md | 80 ++ .../Obtaining_the_IProjectLockService.md | 38 + .../Obtaining_the_IThreadHandling_service.md | 30 + .../Obtaining_the_MSBuild.Project_from_CPS.md | 33 + Documentation/Obtaining_the_ProjectService.md | 26 + Documentation/Overview.md | 10 + Documentation/Project_Capabilities.md | 95 ++ Documentation/Project_configurations.md | 128 ++ Documentation/Property_pages.md | 53 + Documentation/Property_value_editors.md | 11 + ...tom_icons_for_the_Project_TypeItem_type.md | 6 + Documentation/Query_output_groups.md | 16 + Documentation/Reference_Manager.md | 3 + Documentation/Responsive_design.md | 88 ++ Documentation/Scopes.md | 167 +++ ...des_under_projects_in_Solution_Explorer.md | 26 + Documentation/Subscribe_to_project_data.md | 81 ++ .../Sync_up_shims_to_latest_project_model.md | 15 + Documentation/The_Project_Lock.md | 78 ++ Documentation/Threading_model.md | 24 + ...ARNING_to_folks_taking_a_CPS_dependency.md | 28 + Documentation/What_is_CPS.md | 45 + Documentation/Who_holds_a_project_lock.md | 1042 +++++++++++++++++ Index.md | 72 ++ 74 files changed, 4885 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 Documentation/3_Threading_Rules.md create mode 100644 Documentation/Add_a_source_item_with_specific_item_type.md create mode 100644 Documentation/Analyze_Hangs.md create mode 100644 Documentation/Appropriately_schedule_async_tasks.md create mode 100644 Documentation/Async_hang_debugging.md create mode 100644 Documentation/Automatic_DependentUpon_wireup.md create mode 100644 Documentation/BlockDefer_critical_project_operations.md create mode 100644 Documentation/Blocked_Add_custom_tabs_to_the_Reference_Manager.md create mode 100644 Documentation/CPS_Core_vs._CPS_VS.md create mode 100644 Documentation/Clients_Automation.md create mode 100644 Documentation/Clipboard.md create mode 100644 Documentation/Command_handlers.md create mode 100644 Documentation/Contentitem_types.md create mode 100644 Documentation/CookBook.md create mode 100644 Documentation/Custom_Debugger.md create mode 100644 Documentation/Custom_item_types.md create mode 100644 Documentation/Custom_reference_types.md create mode 100644 Documentation/Early_Drafts.md create mode 100644 Documentation/Extensibility_points.md create mode 100644 Documentation/External_customer_guidance.md create mode 100644 Documentation/Finding_CPS_in_a_VS_project.md create mode 100644 Documentation/GetMkDocument_returns_12_style_strings.md create mode 100644 Documentation/HOWTOs.md create mode 100644 Documentation/Hide_some_of_the_tabs_in_the_Reference_Manager_Dialog.md create mode 100644 Documentation/How_to_add_a_fast_uptodate_check.md create mode 100644 Documentation/How_to_create_a_new_CPSbased_project_type.md create mode 100644 Documentation/How_to_detect_whether_a_project_is_a_CPS_project.md create mode 100644 Documentation/IFileSystemErrorMessageProvider.md create mode 100644 Documentation/IProfilableProjectProvider.md create mode 100644 Documentation/IProjectPropertiesProvider.md create mode 100644 Documentation/IProjectSourceItemProviderExtension.md create mode 100644 Documentation/IProjectTreeModifier.md create mode 100644 Documentation/IProjectTreeProvider.md create mode 100644 Documentation/IPublishProvider.md create mode 100644 Documentation/IValidProjectReferenceChecker.md create mode 100644 Documentation/Images/Fig.png create mode 100644 Documentation/Images/Fig_2.png create mode 100644 Documentation/Images/Fig_3.png create mode 100644 Documentation/Images/Fig_4.png create mode 100644 Documentation/Images/Fig_5.png create mode 100644 Documentation/Interfaces_NOT_defined_on_IVsProject_object.md create mode 100644 Documentation/Interfaces_defined_on_IVsProject_object.md create mode 100644 Documentation/Introduction_to_new_project_from_wizard.md create mode 100644 Documentation/Introductory_Note_to_CPS_candidate_users.md create mode 100644 Documentation/IsDocumentInProject_extensibility.md create mode 100644 Documentation/ItemIDs.md create mode 100644 Documentation/MEF.md create mode 100644 Documentation/New_capabilities_for_item_templates.md create mode 100644 Documentation/Notification_for_async_project_load_completion.md create mode 100644 Documentation/Obtaining_the_IProjectLockService.md create mode 100644 Documentation/Obtaining_the_IThreadHandling_service.md create mode 100644 Documentation/Obtaining_the_MSBuild.Project_from_CPS.md create mode 100644 Documentation/Obtaining_the_ProjectService.md create mode 100644 Documentation/Overview.md create mode 100644 Documentation/Project_Capabilities.md create mode 100644 Documentation/Project_configurations.md create mode 100644 Documentation/Property_pages.md create mode 100644 Documentation/Property_value_editors.md create mode 100644 Documentation/Provide_custom_icons_for_the_Project_TypeItem_type.md create mode 100644 Documentation/Query_output_groups.md create mode 100644 Documentation/Reference_Manager.md create mode 100644 Documentation/Responsive_design.md create mode 100644 Documentation/Scopes.md create mode 100644 Documentation/Special_nodes_under_projects_in_Solution_Explorer.md create mode 100644 Documentation/Subscribe_to_project_data.md create mode 100644 Documentation/Sync_up_shims_to_latest_project_model.md create mode 100644 Documentation/The_Project_Lock.md create mode 100644 Documentation/Threading_model.md create mode 100644 Documentation/WARNING_to_folks_taking_a_CPS_dependency.md create mode 100644 Documentation/What_is_CPS.md create mode 100644 Documentation/Who_holds_a_project_lock.md create mode 100644 Index.md diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..70dc36a --- /dev/null +++ b/.gitignore @@ -0,0 +1,190 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +x64/ +build/ +bld/ +[Bb]in/ +[Oo]bj/ + +# Roslyn cache directories +*.ide/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +#NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding addin-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +## TODO: Comment the next line if you want to checkin your +## web deploy settings but do note that will include unencrypted +## passwords +#*.pubxml + +# NuGet Packages Directory +packages/* +## TODO: If the tool you use requires repositories.config +## uncomment the next line +#!packages/repositories.config + +# Enable "build/" folder in the NuGet Packages folder since +# NuGet packages use it for MSBuild targets. +# This line needs to be after the ignore of the build folder +# (and the packages folder if the line above has been uncommented) +!packages/build/ + +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml \ No newline at end of file diff --git a/Documentation/3_Threading_Rules.md b/Documentation/3_Threading_Rules.md new file mode 100644 index 0000000..364f1c6 --- /dev/null +++ b/Documentation/3_Threading_Rules.md @@ -0,0 +1,280 @@ +3 Threading Rules +================= + +In Dev12, we consolidated all our lessons learned from writing a complex, +multi-threaded component of Visual Studio into a small and simple set of +rules to avoid deadlocks, unwanted reentrancy, and keep an easier to maintain +codebase. We do this by comprehensively applying just three rules, as outlined +below. In each case, the instance of JoinableTaskFactory used in the samples +comes from ThreadHelper.JoinableTaskFactory ([except for code in CPS and its +extensions​](onenote:Documentation.one#CookBook§ion-id={225839EC-68C9-40B3-AD41-FD0EC362CEDE}&page-id={52074EBC-401C-439F-B4C9-01EDA9A79677}&base-path=https://microsoft.sharepoint.com/teams/vsprojectsystem/Shared +Documents/VS Project System Documentation)​). + +- If a method has certain thread apartment requirements (STA or MTA) it must either: + - Have an asynchronous signature, and asynchronously marshal to the appropriate thread if it isn't originally invoked on a compatible thread. The recommended means of switching to the main thread is: +await joinableTaskFactoryInstance.SwitchToMainThreadAsync(); +OR + - Have a synchronous signature, and throw an exception when called on the wrong thread.  + In particular, no method is allowed to synchronously marshal work to + another thread (blocking while that work is done). Synchronous blocks + in general are to be avoided whenever possible. + +- When an implementation of an already-shipped public API must call asynchronous code and block for its completion, it must do so by following this simple pattern: + joinableTaskFactoryInstance.Run(async delegate { + + await SomeOperationAsync(...); + + }); + +- If ever awaiting work that was started earlier, that work must be Joined. For example, one service kicks off some asynchronous work that may later become synchronously blocking: + JoinableTask longRunningAsyncWork = joinableTaskFactoryInstance.RunAsync(async + delegate { + + await SomeOperationAsync(...); + + }); + + then later that async work becomes blocking: + + longRunningAsyncWork.Join(); + + or perhaps + + await longRunningAsyncWork; + + Note however that this extra step is not necessary when awaiting is + done immediately after kicking off an asynchronous operation. + + In particular, no method should call .Wait() or .Result on an incomplete + task. + + +Additional "honorable mention" rules: (Not JTF related) + +- Never define async void methods. Make the methods return Task instead. + - Exceptions thrown from async void methods always crash the process. + - Callers don't even have the option to await the result. + - Exceptions can't be reported to telemetry by the caller. + - It's impossible for your VS package to responsibly block in Package.Close till your async work is done when it was kicked off this way. + - Be cautious: "async delegate" or "async () =>" become async void methods when passed to a method that accepts Action delegates. Only pass async delegates to methods that accept Func or Func> parameters. + +Frequently Asked Questions + +I don't write code in CPS itself. Do I need to follow these rules? + +If you're writing a CPS extension (one that implements an interface defined +in the Microsoft.VisualStudio.ProjectSystem namespace and/or exports +into the MEF catalog for CPS to find), then it is absolutely required +yes. Otherwise, it's still strongly recommended but not always required. +These rules have been reviewed by several senior and principal developers +including VS architects, who have reviewed these rules and feel that VS +would do well to follow them in managed code where possible. + + +Why should a method that has a dependency on a specific (kind of) thread +be async? + +Efficiency and responsiveness: Switching threads means that the original +thread either can do something else productive (e.g. execute more work from +the threadpool queue, or respond to more messages on the main thread) or +that it uselessly blocks doing nothing. Threads are not free. Threadpool +threads allocate 1MB of stack space and are limited in quantity. The main +thread is even more precious since it's tied directly to responsiveness +and lack thereof. So any opportunity you have to allow your calling thread +to return to a productive state is worth considering. + +Information hiding: the caller no longer has to know what thread the method +requires, whether it's thread-safe, etc. The implementation can change +over time to add or remove thread affinity, or to switch from locking to +scheduling for thread safety, etc. + + +Why do I need to use JoinableTaskFactory.Run to synchronously block on +asynchronous work rather than just calling Task.Wait() or Task.Result? + +If you're on the main thread, because Task.Wait or Task.Result will often +deadlock because you're now synchronously blocking the main thread for +the completion of a task that may need the main thread to complete. + +If you're on a threadpool thread, it means that you're occupying one +threadpool thread to do nothing but block, while other threadpool threads +get enlisted to execute continuations of this work that your own blocking +thread is perfectly capable of executing. When you see .Wait() and +asynchronous code mixed together, you tend to see callstacks with mixed +async and sync methods in it, which means that it may not be just one +thread that is blocked waiting. In fact calling .Wait() could mean your +code is blocking several threadpool threads at once, all to get just one +sequence of code execution to complete. + +In contrast, when you use JoinableTaskFactory.Run, main thread deadlocks +and threadpool exhaustion are automatically mitigated by reusing the +blocking thread to execute the continuations. + + +Why not rely on COM marshaling to switch to the main thread when necessary? + +There are several reasons for this: + +- The COM transition synchronously blocks the calling thread. If the main thread isn't immediately pumping messages, the MTA thread will block until it handles the message. If you're on a threadpool thread, this ties up a precious resource and if your code may execute on multiple threadpool threads at once, there is a very real possibility of [threadpool exhaustion](). +- Deadlock: if the main thread is blocked waiting for the background thread, and the main thread happens to be on top of some call stack (like WPF measure-layout) that suppresses the message pump, the code that normally works will randomly deadlock. +- When the main thread is pumping messages, it will execute your code, regardless as to whether it is relevant to what the main thread may already be doing. If the main thread is in the main message pump, that's fine. But if the main thread is in a pumping wait (in managed code this could be almost anywhere as this includes locks, I/O, sync blocks, etc.) it could be a very bad time. We call these bad times "reentrancy" and the problem comes when you have component X running on the main thread in a pumping wait, the component Y uses COM marshalling to re-enter the main thread, and then Y calls (directly or indirectly) into component X. Component X is typically written with the assumption that by being on the main thread, it's isolated and single-threaded, and it usually isn't prepared to handle reentrancy. As a result, data corruption and/or deadlocks can result. Such has been the source of many deadlocks and crashes in VS for the last few releases. +- Any method from a VS service that returns a pointer is probably inherently broken when called from a background thread. For example, ItemIDs returned from IVsHierarchy are very often raw pointers cast to integers. These pointers are guaranteed to be valid for as long as you're on the main thread (and no event was raised to invalidate it). But when you call a IVsHierarchy method to get an ItemID back from a background thread, you leave the STA thread immediately as the call returns, meaning the pointer is unsafe to use. If you then go and pass that pointer back into the project system, the pointer could have been invalidated in the interim, and you'll end up causing an access violation crash in VS. The only safe way to deal with ItemIDs (or any other pointer type) is while manually marshaled to the UI thread so that you know they are still valid for as long as you hold and use them. +- If your method runs on a background thread and has a loop that accesses a VS service, that can incur a lot of thread transitions which can hurt performance. If you were explicit in your code about the transition, you'd very likely move it to just before you enter the loop, which would make your code more efficient from the start. +- Some VS services don't have proxy stubs registered and thus will fail to the type cast or on method invocation when your code executes on a background thread. +- Some VS services get rewritten from native to managed code, which subtly changes them from single-threaded to free-threaded services. Unless the managed code is written to be thread-safe (most is not) this means that your managed code calling into a managed code VS service on a background thread will not transition to the UI thread first, and you are cruising for thread-safety bugs (data corruption, crashes, hangs, etc). By switching to the main thread yourself first, you won't be the poor soul who has crashes in their feature and has to debug it for days until you finally figure out that you were causing data corruption and a crash later on. Yes, you can blame the free threaded managed code that should have protected itself, but that's not very satisfying after days of investigation. And the owner of that code may refuse to fix their code and you'll have to fix yours anyway. + +How do these rules protect me from re-entering random code on the main +thread? + +By always using asynchronous mechanisms to marshal to the UI thread, you're +effectively send a PostMessage to the UI thread, which will not re-enter +the main thread when it is in a filtered message pump (i.e. a synchronously +blocking Wait). When you use this line in particular: + +await joinableTaskFactoryInstance.SwitchToMainThreadAsync(); + +It not only posts a message to the UI thread but also communicates with +the rest of the threading framework to avoid deadlocks in the event that +the main thread is blocked waiting for you, and you're waiting for the +main thread. That is, using this method to get to the UI thread Just Works: +it avoids both deadlocks and undesirable reentrancy. The only time it +deadlocks is when the threading rules listed above are not being followed. + + +Am I protected from other code re-entering my own code while it executes +on the main thread? + +Yes, somewhat. When you call JoinableTaskFactory.Run with an async delegate, +when your delegate yields (using await) the message pump is temporarily +stopped until relevant work needs to come back to the UI thread to unblock +you so your code can complete its execution. This is a significant amount +of protection since 3rd party code has the greatest opportunity to re-enter +the main thread while the main thread is waiting for background work to +complete, and the JoinableTaskFactory prevents this from happening. + +However, when your code is actively running on the main thread reentrancy +can occur when you call synchronously blocking code (contested locks, +I/O, etc.) simply by virtue of the DispatcherSynchronizationContext that +is responsible for the synchronous block. While you can mitigate this by +disabling the message pump yourself, it's usually not a good idea because +3rd party code you may be calling could be relying on a functioning message +pump. + + +I'm trying to analyze a hang around code that uses JoinableTaskFactory, +but since transitions are asynchronous the active threads' callstacks +don't tell the whole story. How can I find the cause and fix the hang? + +Debugging async hangs in general is lacking debugger tooling support at +the moment. The debugger and Windows Blue teams are working to improve that +situation. In the meantime, we have learned several techniques to figure +out what is causing the hang, and we're working to enhance the framework +to automatically detect, self-analyze and report hangs to you so you have +almost nothing to do but fix the code bug. + +In the meantime, the most useful technique for analyzing async hangs is to +attach WinDBG to the process and dump out incomplete async methods' states. +This can be tedious, but we have a script in this file that you can use +to make it much easier: [Async hang debugging](Async_hang_debugging.md) + + +What is threadpool exhaustion, and why is it bad? + +The threadpool only has so many threads (usually equal to the number of +CPU cores) with which to execute work in the threadpool queue. Tying up a +threadpool thread with nothing but waiting for something to happen means +reduced opportunity for concurrent execution of other work. But when all +threadpool threads are blocked waiting for an event, you have threadpool +exhaustion. In this state, the threadpool can't execute any more work. +Sometimes, the event the threads are waiting to be set will only be set +by another work item that is still in the threadpool's own queue. This +would deadlock, except that the CLR recognizes that after a full second +of no dequeuing from the threadpool queue something may be wrong, and the +CLR reluctantly adds another thread to the threadpool in order to dequeue +just one more item from the queue and try to break the deadlock. + +If the unblocking work item isn't at the head of the queue, the newly +added thread will either block again (like the others) or keep dequeing +work items and executing them until the queue is depleted (and hopefully +unleashing the rest of the threads in the threadpool). Eventually, the +extra threads that were added to the threadpool exit. + +Threadpool exhaustion is bad because it can cause severe responsiveness +issues in the application. As a real case study, during development of +Dev11 we had a case where about 81 items were queued to the threadpool, +and the first 80 would block until some event was set. The 81st item would +set that event. The main thread was blocked waiting for these background +tasks to complete. This wasn't in source code so obviously broken of course, +but it was how execution happened to go at times. The first 4 items were +dequeued and filled the threadpool, and VS now entered a hang state. 1 +second later, a fifth thread was added to the threadpool and dequeued one +more item. Each second, another thread was added and the queue got closer +to that 81st item. With each added thread, VS added 1MB of committed memory +for the newly created thread's stack. 76 seconds later, the threadpool +now with 81 threads broke through the deadlock and VS resumed, and a few +seconds later 76 threads exited that were no longer needed. + +This problem occurred in several places in CPS, and at least a couple places +in other VS components. One often straightforward fix is to asynchronously +wait for what you need rather than synchronously wait. If that had happened +above, all 80 items on the queue would have very quickly started, and +then suspended themselves allowing the 81st item to quickly run, set the +event, and cause those 80 items to reschedule themselves on the queue and +get their work done promptly without ever causing VS to hang or add 76MB +of working set memory. + + +I'm writing an async method that isn't in a JoinableTask. Should I use +JTF.SwitchToMainThreadAsync() to get to the UI thread? + +Yes. JoinableTaskFactory.SwitchToMainThreadAsync() works great outside +a JoinableTask. It simply posts the continuation to the main thread for +execution, which is the generally accepted safe mechanism for asynchronously +marshaling to the main thread. And if the caller is already on the main +thread, then using this technique is extremely lightweight as you avoid +allocating any closures and delegates. + +Keep in mind that although you're not calling this async method within +a JoinableTask, a caller even lower in the callstack may actually have +created one before it called your code. This makes it an especially good +idea to use JTF.SwitchToMainThreadAsync(), as it means if your caller ever +synchronously blocks on the completion of your code you won't deadlock. + +One more reason: if you don't use this method, you'll probably be hard-coding +a priority of how to get to the main thread (background, normal, high). +But often the code that needs the main thread isn't the outer scenario, +and therefore shouldn't really be making the decision about the priority to +the UI thread. For example, your same code may be called from a background +operation and another time as a foreground operation, without your code able +to discern between the two and make the appropriate choice for priority, +and doing so would add unnecessary complexity to your code. Instead, just +focus on the fact that at this point, your code needs the main thread and +call JTF.SwitchToMainThreadAsync(). This allows your caller to set the +priority via the JoinableTask it may call your code within. + + +What message priority is used to switch to (or resume on) the main thread, +and can this be changed? + +JoinableTaskFactory’s default behavior is to post to the main thread, +which puts it below RPC and above user input in priority. + +How to use a different priority for switching to the main thread in VS. + +The following describes how to replace the mechanism for getting to the +UI thread in a host-independent way: + +You can set your own priority by creating your own derived type of +JoinableTaskFactory and overriding the PostToUnderlyingSynchronizationContext +method. This method is responsible both for initial switches to the UI +thread as well as resuming on the UI thread after a yielding await. + +Note that the JoinableTaskFactory class has no default constructor, so when +implementing your own JoinableTaskFactory-derived type you will need to add +your own constructor that chains in the base constructor, passing in the +required parameters. You are then free to directly instantiate your derived +type by passing in either a JoinableTaskContext or a JoinableTaskCollection. + + +From <[https://microsoft.sharepoint.com/teams/DD_VSIDE/Visual%20Studio%20IDE%20Team%20Wiki/Threading%20Rules.aspx](https://microsoft.sharepoint.com/teams/DD_VSIDE/Visual%20Studio%20IDE%20Team%20Wiki/Threading%20Rules.aspx)> + diff --git a/Documentation/Add_a_source_item_with_specific_item_type.md b/Documentation/Add_a_source_item_with_specific_item_type.md new file mode 100644 index 0000000..b77bd32 --- /dev/null +++ b/Documentation/Add_a_source_item_with_specific_item_type.md @@ -0,0 +1,29 @@ +Add a source item with specific item type +========================================= + +Visual Studio project systems like an IVs* interface for adding items +with explicitly specified item types. Normally this is sufficient because +the project system can pick reasonable defaults for item types based +on file extension or expected project behavior. These defaults [can be +augmented](onenote:Documentation.one#Custom%20item%20types§ion-id={949F487D-4BC2-4B7C-B889-A62D8BB6120F}&page-id={853099AB-5896-4EDB-8F48-D07E64BB2000}&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo/CPS). +If you still need to explicitly specify an item type for a project item, +follow these steps: + + +ConfiguredProject configuredProject; // [obtain a +ConfiguredProject](onenote:Documentation.one#Obtaining%20ConfiguredProject§ion-id={949F487D-4BC2-4B7C-B889-A62D8BB6120F}&page-id={7072BCCB-F3BF-4944-93A3-9D720B68F518}&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo/CPS) + +IProjectItemProvider sourceItems = configuredProject.Services.SourceItems; + +await sourceItems.AddAsync("CustomItemType", "projectRelativePath\ToYourFile.xpp"); + + +When using this approach to add source files to the project, CPS will: + +- Add the source file to source control, if it is within the project directory. +- Automatically add the item to Solution Explorer, DTE, and raise other appropriate events if indeed the item you're adding has an item type that belongs to [the set of source item types](onenote:Documentation.one#Custom%20item%20types§ion-id={949F487D-4BC2-4B7C-B889-A62D8BB6120F}&page-id={853099AB-5896-4EDB-8F48-D07E64BB2000}&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo/CPS). +CPS will not: + +- Copy the file into the project directory if it is not already there. +- Expand an item template + diff --git a/Documentation/Analyze_Hangs.md b/Documentation/Analyze_Hangs.md new file mode 100644 index 0000000..dc4148d --- /dev/null +++ b/Documentation/Analyze_Hangs.md @@ -0,0 +1,3 @@ +Analyze Hangs +============= + diff --git a/Documentation/Appropriately_schedule_async_tasks.md b/Documentation/Appropriately_schedule_async_tasks.md new file mode 100644 index 0000000..ec14763 --- /dev/null +++ b/Documentation/Appropriately_schedule_async_tasks.md @@ -0,0 +1,24 @@ +Appropriately schedule async tasks +================================== + + +For UnconfiguredProject scoped MEF parts: + + [Import(ExportContractNames.Scopes.UnconfiguredProject)] + + IProjectAsynchronousTasksService AsyncTasksService { get; set; } + + +For ConfiguredProject scoped MEF parts: + + [Import(ExportContractNames.Scopes.ConfiguredProject)] + + IProjectAsynchronousTasksService AsyncTasksService { get; set; } + + +### Ensure your async work doesn't hold up solution close too long + + + +AsyncTasksService + diff --git a/Documentation/Async_hang_debugging.md b/Documentation/Async_hang_debugging.md new file mode 100644 index 0000000..269b81b --- /dev/null +++ b/Documentation/Async_hang_debugging.md @@ -0,0 +1,153 @@ +Async hang debugging +==================== + +NOTE: + + This prints out ALL async methods that are on the heap, whether they +are completed or not. + + The way to ensure that you only see incompleted async methods is to be +sure to execute a GC + + prior to running this script. + + +This formatted loop is here for readability and maintenance. But the +actual string to copy into windbg is the ugly one-liner below. + +.foreach /pS 7 /ps 1000 (mt {!name2ee +mscorlib.dll!System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner}) + +{ + + .foreach (movenext { !dumpheap -short -mt ${mt} }) + + { + + .foreach /pS 1 (method { dd ${movenext}+8 l1 }) + + { + + .foreach /pS 1 /ps 1000 (methodName { !do -nofields ${method} + }) + + { + + .echo ${method} ${methodName} + + } + + } + + } + +} + + +.foreach /pS 7 /ps 1000 (mt {!name2ee +mscorlib.dll!System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner}) + { .foreach (movenext { !dumpheap -short -mt ${mt} }) +{ .foreach /pS 1 (method { dd ${movenext}+8 l1 }) + { .foreach /pS 1 /ps 1000 (methodName +{ !do -nofields ${method} }) { + .echo ${method} ${methodName} } + } } } + + +Or, when SOS and CLR versions are mismatched: + +.foreach /pS 2a /ps 1000 (mt {!name2ee +mscorlib.dll!System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner}) + { .foreach /pS 23 (movenext { !dumpheap -short -mt ${mt} }) + { .foreach /pS 1 (method { dd ${movenext}+8 l1 +}) { .foreach /pS 24 /ps 1000 +(methodName { !do -nofields ${method} }) { + .echo ${method} ${methodName} + } } } } + + +or for debugging a 64-bit process: (untested, but reportedly useful) + +.foreach /pS 7 /ps 10 (mt {!name2ee +mscorlib.dll!System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner}) +{.foreach (moveNextRunner {!DumpHeap -MT ${mt} -short}) {!do poi(${moveNextRunner}+10)}} + + +Sample output from this command: (shows the addresses of the async methods +that give more information, and the name of the async method) + +0355a078 Microsoft.VisualStudio.ProjectSystem.Utilities.Designers.ProjectDataSources+<>c__DisplayClass1a+<b__15>d__1f + +0362d2ac Microsoft.VisualStudio.PlatformUI.RunOnIdleTaskScheduler+d__4 + +03615550 Microsoft.VisualStudio.ProjectSystem.Utilities.Designers.ProjectDataSources+<>c__DisplayClass1a+<b__15>d__1f + +103052f0 Microsoft.VisualStudio.ProjectSystem.Designers.ProjectBuildSnapshotService+d__7 + +10305460 Microsoft.VisualStudio.ProjectSystem.Designers.CustomizableBlockSubscriberBase`3+d__9[[System.Tuple`2[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, + +103055a0 Microsoft.VisualStudio.ProjectSystem.Designers.CustomizableBlockSubscriberBase`3+<b__2>d__4[[System.Tuple`2[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, + +103056dc Microsoft.VisualStudio.ProjectSystem.Utilities.DataflowExtensions+<>c__DisplayClass1f`2+<b__1e>d__21[[System.Tuple`2[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, + +0358e0a0 Microsoft.VisualStudio.ProjectSystem.Utilities.Designers.ProjectDataSources+<>c__DisplayClass1a+<b__15>d__1f + +10318024 Microsoft.VisualStudio.ProjectSystem.Utilities.Designers.ProjectDataSources+<>c__DisplayClass1a+<b__15>d__1f + +03526cec Microsoft.VisualStudio.ProjectSystem.Utilities.Designers.ProjectDataSources+<>c__DisplayClass1a+<b__15>d__1f + +1041993c Microsoft.VisualStudio.ProjectSystem.Utilities.Designers.ProjectDataSources+<>c__DisplayClass1a+<b__15>d__1f + +1080b6bc Microsoft.VisualStudio.ProjectSystem.Utilities.Designers.ProjectDataSources+<>c__DisplayClass1a+<b__15>d__1f + +107ec1ac Microsoft.VisualStudio.ProjectSystem.Utilities.Designers.ProjectDataSources+<>c__DisplayClass1a+<b__15>d__1f + +108e7c38 Microsoft.VisualStudio.ProjectSystem.Utilities.Designers.ProjectDataSources+<>c__DisplayClass1a+<b__15>d__1f + +1081f3ac Microsoft.VisualStudio.ProjectSystem.Utilities.DataflowExtensions+<>c__DisplayClass29`2+<b__26>d__2b[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, + +036534f4 Microsoft.VisualStudio.ProjectSystem.Utilities.DataflowExtensions+<>c__DisplayClass29`2+<b__26>d__2b[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, + +109093d0 Microsoft.VisualStudio.ProjectSystem.Utilities.DataflowExtensions+<>c__DisplayClass29`2+<b__26>d__2b[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, + +109202a8 Microsoft.VisualStudio.ProjectSystem.Designers.ProjectBuildSnapshotService+d__7 + +10920418 Microsoft.VisualStudio.ProjectSystem.Designers.CustomizableBlockSubscriberBase`3+d__9[[System.Tuple`2[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, + +10920558 Microsoft.VisualStudio.ProjectSystem.Designers.CustomizableBlockSubscriberBase`3+<b__2>d__4[[System.Tuple`2[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, + +10920694 Microsoft.VisualStudio.ProjectSystem.Utilities.DataflowExtensions+<>c__DisplayClass1f`2+<b__1e>d__21[[System.Tuple`2[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, + +0358b474 Microsoft.VisualStudio.ProjectSystem.Utilities.DataflowExtensions+<>c__DisplayClass29`2+<b__26>d__2b[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, + +107e0d60 Microsoft.VisualStudio.ProjectSystem.Utilities.Designers.ProjectDataSources+<>c__DisplayClass1a+<b__15>d__1f + +0366195c Microsoft.VisualStudio.ProjectSystem.Utilities.Designers.ProjectDataSources+<>c__DisplayClass1a+<b__15>d__1f + +18465134 Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.UnconfiguredProjectHostBridge`3+d__4[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[System.Tuple`3[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectTreeSnapshot, + +18465290 Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.TreeService+d__d + +184653dc Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.TreeService+d__11 + +18465530 Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Designers.LanguageServiceBase+d__1b + +10912f64 Microsoft.VisualStudio.ProjectSystem.Utilities.Designers.ProjectDataSources+<>c__DisplayClass1a+<b__15>d__1f + +03653428 Microsoft.VisualStudio.ProjectSystem.Utilities.Designers.ProjectDataSources+<>c__DisplayClass1a+<b__15>d__1f + +10914284 Microsoft.VisualStudio.ProjectSystem.Utilities.Designers.ProjectDataSources+<>c__DisplayClass1a+<b__15>d__1f + +188249c4 Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.UnconfiguredProjectHostBridge`3+d__4[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[System.Tuple`3[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectTreeSnapshot, + +18824b44 Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.TreeService+d__d + +18824cb4 Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.TreeService+d__11 + +18824e2c Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.ProjectNode+d__24f + +18825064 Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.ProjectNode+<>c__DisplayClasscd+<b__cc>d__cf + +188251c8 Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.ProjectNode+<>c__DisplayClass1b7+<b__1b5>d__1ba + + diff --git a/Documentation/Automatic_DependentUpon_wireup.md b/Documentation/Automatic_DependentUpon_wireup.md new file mode 100644 index 0000000..8f708f2 --- /dev/null +++ b/Documentation/Automatic_DependentUpon_wireup.md @@ -0,0 +1,77 @@ +Automatic DependentUpon wire-up +=============================== + +CPS can automatically add the necessary metadata to your +project items for both Add New Item and Add Existing Item scenarios based +on file extension patterns that you prescribe in your XAML files. + + + +Limitation: + +The child file name must be formed as “.”. A few examples: “.xaml.cs”, “.aspx.cs”, “.aspx.designer.cs”, +etc. + + + +How-to: + +Need to hint CPS the ‘dependent file extension’ being associated with +a ‘parent file extension’. That is done via authoring xaml rules. For +instance, we would like to make all the files ending with ‘.xaml.cs’ be +under the corresponding parent .xaml files. + + +Firstly, we need to define a content type and a mapping from ‘file +extension’ to ‘content type’. They could be added into the existing +ProjectItemsSchema.xaml file, or a new xaml file being included in project +system specific .targets file. + + + + + + + + + + + +Then when CPS handles a .xaml file, it could map it to a content type +and retrieve more metadata from the content type. Next, we need to +hint CPS the ‘dependent file extension’ of ‘.xaml’ via adding metadata +“DependentFileExtensions” into the content type. Multiple dependent file +extensions are allowed and must be separated by “;” (semicolon). + + + + + + + + +Once the xaml rules are authored, CPS would fixup “DependentUpon” metadata +for the child file when the parent file or child file is being added into +project. In addition, it inherits a behavior from VB/C# that supports +adding the child files automatically when user only selects and adds the +parent file. + + +A real example could be found in C:\Program Files +(x86)\MSBuild\Microsoft\WindowsXaml\v12.0\8.1\en-US\CSharp.ProjectItemsSchema.xaml. + diff --git a/Documentation/BlockDefer_critical_project_operations.md b/Documentation/BlockDefer_critical_project_operations.md new file mode 100644 index 0000000..7c690d4 --- /dev/null +++ b/Documentation/BlockDefer_critical_project_operations.md @@ -0,0 +1,23 @@ +Block/Defer critical project operations +======================================= + +You can block critical project operations (Build, Save, Rename, +Unload) until specified tasks complete by registering your tasks via +IProjectAsynchronousTasksService + + RegisterAsycTask() with a ProjectCriticalOperation flag is provided + to support this: + + void RegisterAsyncTask(JoinableTask joinableTask, ProjectCriticalOperation + operationFlags, bool registerFaultHandler = false) + + +E.g. if you want to defer the build, you can register your tasks that you +want to wait on for build by passing in ProjectCriticalOperation.Build as +the flag. + + +For closing project, we provide a CancellationToken you can use to bail +out quickly instead of blocking project close for a long time. + + diff --git a/Documentation/Blocked_Add_custom_tabs_to_the_Reference_Manager.md b/Documentation/Blocked_Add_custom_tabs_to_the_Reference_Manager.md new file mode 100644 index 0000000..eadc0b0 --- /dev/null +++ b/Documentation/Blocked_Add_custom_tabs_to_the_Reference_Manager.md @@ -0,0 +1,10 @@ +Blocked - Add custom tabs to the Reference Manager +================================================== + +Blocked - Not currently possible because of APIs are not public + + +Define new class + +- Implements [IVsReferenceManagerUserAsync](http://index/Microsoft.VisualStudio.ProjectSystem.VS.Implementation/R/16712c0dde938aab.html) +- tagged with the ExportIVsReferenceManagerUserAsync attribute diff --git a/Documentation/CPS_Core_vs._CPS_VS.md b/Documentation/CPS_Core_vs._CPS_VS.md new file mode 100644 index 0000000..40c0c1c --- /dev/null +++ b/Documentation/CPS_Core_vs._CPS_VS.md @@ -0,0 +1,79 @@ +CPS Core vs. CPS VS +=================== + +A project system may have the potential to be used outside of the VS IDE. + A developer might want to test his project out of the IDE environment, +or even host the project outside VS. It is desirable that a carefully +designed project system can be used both inside and outside the Visual +Studio IDE. + + +On the other hand, the Visual Studio IDE is a rich environment; therefore, +the primary reason to create a project system is to make it work with +Visual Studio, and integrate it with the rest of the IDE features, e.g. +the solution explorer as well as various type of designers and editors, so +that the project system provides a seamless environment for a developer to +create an application. That all being said, it means the project system +has to implement contracts which the Visual Studio environment defined +and use other contracts to talk to the rest of the Visual Studio, which +requires the implementation of the project system depend on some parts of +the Visual Studio. + + +The CPS system, with the purpose of it being used out of the IDE, especially +for the testability, was designed to contain two pieces, namely, a core +piece (the CPS Core), which is expected to be independent of the VS IDE +environment; and another piece (CPS VS) which is deeply integrated with +the Visual Studio IDE, and therefore is not expected to work in a different +environment. + + +Most extension developers do not need to pay much attention to the difference +between these two pieces. Advanced developers who want to write unit +tests and control the dependency to VS can benefit from paying attention +to the difference between the two pieces. + + +Both pieces of the CPS contain one or more contract assemblies, or one or +more implementation assemblies, or possibly some utilities. + + +### CPS Core + +CPS core contains such assemblies as: + +- Microsoft.VisualStudio.ProjectSystem.dll + This is the assembly that contains core contracts of the CPS system, + including both contracts of components provided by CPS system, and + those expected to be provided by extensions. The implementation of + a certain contract in an extension may depend on the Visual Studio + environment. + +- Microsoft.VisualStudio.ProjectSystem.Utilities.v14.0.dll + This contains reusable base classes or utility classes, both of which + make creating a CPS extensions easier or help other features talk to + CPS projects. It is expected to be used by CPS extensions. + +- Microsoft.VisualStudio.ProjectSystem.Core.Impl.dll + This contains MEF components in the CPS core system, and it is not + expected to be directly referenced by an extension assembly. + + +### CPS VS + +CPS VS contains such assemblies as: + +- Microsoft.VisualStudio.ProjectSystem.VS + This contains contracts of the CPS VS system, including both contracts + of components provided by CPS VS layer and those expected to be provided + by extensions and consumed by this layer. Contracts defined here may + depend on other VS contracts. + +- Microsoft.VisualStudio.ProjectSystem.VS.Implementation + This is the implementation of the CPS VS layer, which contains both + the implementation of MEF components in the CPS VS layer and objects + required by VS. It is exposed to VS as a Visual Studio package, so + it can be loaded and bootstrap the entire CPS system inside VS. + + It is not expected to be referenced by an extension directly. + diff --git a/Documentation/Clients_Automation.md b/Documentation/Clients_Automation.md new file mode 100644 index 0000000..78d0cfd --- /dev/null +++ b/Documentation/Clients_Automation.md @@ -0,0 +1,3 @@ +Clients / Automation +==================== + diff --git a/Documentation/Clipboard.md b/Documentation/Clipboard.md new file mode 100644 index 0000000..ce35248 --- /dev/null +++ b/Documentation/Clipboard.md @@ -0,0 +1,5 @@ +Clipboard +========= + +ICopyPackager / IPasteProvider + diff --git a/Documentation/Command_handlers.md b/Documentation/Command_handlers.md new file mode 100644 index 0000000..9fe5007 --- /dev/null +++ b/Documentation/Command_handlers.md @@ -0,0 +1,63 @@ +Command handlers +================ + +Visual Studio command routing is a complex system. Some commands get routed +to a project, and when that occurs you may want to handle that command on +behalf of a project. This document describes how to do that. + + +You may export either of two interfaces: + +- [ICommandGroupHandler](http://index/Microsoft.VisualStudio.ProjectSystem.V14Only/R/8be28c206c1d3bff.html) +- [IAsyncCommandGroupHandler](http://index/Microsoft.VisualStudio.ProjectSystem.V14Only/R/4177740e3e50f8eb.html) + +Either interface works for any command routed to the project. The one +you choose should be based on whether or not your command handler is more +appropriately implemented as an async method. You can change which interface +you export on an existing command handler without backward breaking changes +and handle the same commands as before. + + +When you export the interface you should use the +[ExportCommandGroup](http://index/Microsoft.VisualStudio.ProjectSystem.Utilities.v14.0/A.html#e4d4859e94b3cf13) +attribute which allows you to specify the command group GUID your extension +handles commands for. The GUID comes from the vsct file that defines the +Visual Studio command(s) you will handle. While your extension can handle +any number of commands from one command group, a given exported class +can only handle commands from one command group. If you need to handle +commands from multiple command groups, you must define a unique command +handler extension for each command group. + + +When your command handler is invoked, you will be provided the context on +which the command was invoked. For example, the set of items in Solution +Explorer that were selected when the command was invoked will be passed +to your extension. + + +When your handler is invoked, you can inspect the inputs and decide whether +you want to handle the command or return a NotHandled result. CPS will daisy +chain in each command handler in [priority order](Extensibility_points.md) +till one of them indicate that they have fully handled the command. + + +To add a command handler to a Javascript project for example, you might +code up something like this: + + +[[ExportCommandGroup](http://index/Microsoft.VisualStudio.ProjectSystem.Utilities.v14.0/A.html#e4d4859e94b3cf13)("some-guid-here")] + +[[AppliesTo](http://index/Microsoft.VisualStudio.ProjectSystem.Utilities.v14.0/A.html#84c3c630297dcc4b)("[your +appliesTo expression](Extensibility_points.md)")] + +internal class MyOwnCommands : +[ICommandGroupHandler](http://index/Microsoft.VisualStudio.ProjectSystem.V14Only/A.html#8be28c206c1d3bff) + +{ + + public CommandStatusResult GetCommandStatus(…) { } + + public bool TryHandleCommand(…) { } + +} + diff --git a/Documentation/Contentitem_types.md b/Documentation/Contentitem_types.md new file mode 100644 index 0000000..fc610ea --- /dev/null +++ b/Documentation/Contentitem_types.md @@ -0,0 +1,77 @@ +Content/item types +================== + +Introduction +------------ + +Currently, only items in your project with recognized item types will appear +in Solution Explorer or be available as project items via automation. + + +This page describes how to add support for a new item type using the +built-in "Project Item Type" project item template. + + +Tutorial +-------- + +Let's suppose that you would like to add support to your project type for +a new file that has the extension ".foo". + +### Adding support for a new item type + +- In the Solution Explorer, Right click on the "Rules" subfolder of your ProjectType project (typically located under [ProjectType]\BuildSystem\Rules) +- From the context menu, select Add -> New Item to invoke the Add New Item Dialog (see screenshot below) + - Select Visual C# Items\Extensibility\Project Item Type + - Provide the following name "Foo.xaml" - the name of the file ("Foo") represents the file extension of the item type we are adding (".foo") + - Press Add +- Important: Follow the additional instructions included in the file to update ProjectItemsSchema.xaml and CustomProjectCs.targets with the provided code snippets +- Done! + +![](Images/Fig_2.png) + +### Using the new item type + +Now let's see the new item type in action - because there is not item +template yet for a file ".foo" we need to create it and include it in the +project manually + +- Build and run VS with your Project Type (by default ProjectType1) +- Create a new Project of type Project Type (by default ProjectType11) +- Right click on the project node in solution explorer -> Open Folder in File Explorer + - In File Explorer, create a new Text Document - name it "Test.foo" +- Switch back to Visual Studio +- In Solution Explorer, right click on the project node -> Add Existing Item and select the file you created above ("Test.foo") + +#### Observations + +Here are some things to notice about the newly added file: + +- Select "Test.foo" in the Solution Explorer +- Look at the Properties Window -> you should notice that a custom property "My Property" gets displayed for "Test.foo". That property was defined in the Rules file that was included above +- Set some value for "My Property" e.g. "abc" and press enter +![](Images/Fig_3.png) +- In a similar way, press the "Property Pages" button in the Properties Window - this will open the Property Pages dialog, that should show the property and its value +![](Images/Fig_4.png) +- If you open the project file, you will notice that the file was added to the project according to our definition, and that the custom property "MyProperty" was set for the current configuration to the value specified above. Here is how to do that: + - Right click on the project node in Solution Explorer -> Unload Project (save changes) + - Right click again on the project in Solution Explorer -> Edit ProjectType11.myproj + + + + abc + + + + +More details +------------ + +- See also [Custom item types](Custom_item_types.md) +- More documentation about defining a .xaml rule file for your item type: + [http://blogs.msdn.com/b/vsproject/archive/2009/06/10/platform-extensibility-part-1.aspx](http://blogs.msdn.com/b/vsproject/archive/2009/06/10/platform-extensibility-part-1.aspx) + + [http://blogs.msdn.com/b/vsproject/archive/2009/06/18/platform-extensibility-part-2.aspx](http://blogs.msdn.com/b/vsproject/archive/2009/06/18/platform-extensibility-part-2.aspx) + + + diff --git a/Documentation/CookBook.md b/Documentation/CookBook.md new file mode 100644 index 0000000..6615913 --- /dev/null +++ b/Documentation/CookBook.md @@ -0,0 +1,206 @@ +CookBook +======== + +Important for CPS users: If you're in CPS or a CPS extension, please +replace all references to "ThreadHelper.JoinableTaskFactory" with +"this.ThreadHandling.AsyncPump", where "this.ThreadHandling" is an [Import] +IThreadHandling. + + + +Initial setup + +- Reference Microsoft.VisualStudio.Threading.dll +- Add #using Microsoft.VisualStudio.Threading; to the start of any relevant C# source files. + +Block a thread while doing async w​ork + + +ThreadHelper.JoinableTaskFactory.Run(async delegate { + + // caller's thread + + await SomeOperationAsync(...); + + + // switch to main thread + + await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); + + SomeUIThreadBoundWork(); + + + // switch to threadpool + + await TaskScheduler.Default; // #using Microsoft.VisualStudio.Threading; + + SomeWorkThatCanBeOnThreadpool(); + +}); + + +If any of your async work should be on a background thread, you can switch +explicitly: + + +// assuming we're on the UI thread already… + +await Task.Run(async delegate { + + // we're on a background thread now + +}); + +// …now we're back on the UI thread. + + +Alternatively: + + +// On some thread, but definitely want to be on the threadpool (requires +using the Microsoft.VisualStudio.Threading namespace): + +await TaskScheduler.Default; + + +// On some thread, but definitely want to be on the main thread: + +await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); + + +How to switch to the UI thread + +In an async me​th​​od + +await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); + +In a sync metho​​d + +First, consider carefully whether you can make your method async first +and then follow the above pattern. If you must remain synchronous, you +can switch to the UI thread like this: + +ThreadHelper.JoinableTaskFactory.Run(async delegate { + + await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); + + // You're now on the UI thread. + +}); + + +How to switch to the UI thread using a specific priority​​​ + +Simply call the JoinableTaskFactory.RunAsync extension method (defined in +the Microsoft.VisualStudio.Shell namespace) passing in a priority as the +first parameter, like this: + + + await ThreadHelper.JoinableTaskFactory.RunAsync( + + VsTaskRunContext.UIThreadBackgroundPriority, + + async delegate + + { + + // On caller's thread. Switch to main thread (if we're not +already there). + + await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); + + + + // Now on UI thread via background priority. + + await Task.Yield(); + + + + // Resumed on UI thread, also via background priority. + + }); + + +How can I complet​​e asynchronously with respect to my caller while still +using the UI thread? + +If you need to complete work on the UI thread, and your caller is +(usually) on the UI thread, but you want to return a Task to +your caller and complete the work asynchronously, you should use the +JoinableTaskFactory.RunAsync method, as described in the answer to: How +do I switch to the UI thread using a specific priority? + + + +How can I await IVsTa​​sk? + +Make sure you have these using directives at the top of your code file: + + using System.Threading.Tasks; + + using Microsoft.VisualStudio.Shell; + + using Task = System.Threading.Tasks.Task; + +That adds a [GetAwaiter extension +method](http://index/#Microsoft.VisualStudio.Shell.14.0/VsTaskLibraryHelper.cs%2c6a2f5b2c93145a01%2creferences) +to IVsTask that makes it awaitable. In fact just the Microsoft.VisualStudio.Shell +namespace is required for that. But the first one is very useful. And since +they both define Task classes they conflict making TPL Task difficult to +use unless you add the third line. + + +How can I return IVsTask​​ from a C# async method? + +The preferred way is to use the JoinableTaskFactory.RunAsyncAsVsTask(Func) extension method. This gives you a CancellationToken that is tied +to IVsTask.Cancel(). + + +public IVsTask DoAsync() { + + return ThreadHelper.JoinableTaskFactory.RunAsyncAsVsTask( + + VsTaskRunContext.UIThreadNormalPriority, // (or lower UI thread +priorities) + + async cancellationToken => { + + await SomethingAsync(cancellationToken); + + await SomethingElseAsync(); + + }); + +} + + +private async Task SomethingAsync(CancellationToken cancellationToken) { + + await Task.Yield(); + +} + + +Alternately, if you only have a JoinableTask, you can readily convert it +to an IVsTask by calling the JoinableTask.AsVsTask() extension method. + + +public IVsTask DoAsync() { + + return ThreadHelper.JoinableTaskFactory.RunAsync( + + async delegate { + + await SomethingAsync(); + + await SomethingElseAsync(); + + }).AsVsTask(); + +} + + +From <[https://microsoft.sharepoint.com/teams/DD_VSIDE/Visual%20Studio%20IDE%20Team%20Wiki/Threading%20Cookbook.aspx](https://microsoft.sharepoint.com/teams/DD_VSIDE/Visual%20Studio%20IDE%20Team%20Wiki/Threading%20Cookbook.aspx)> + diff --git a/Documentation/Custom_Debugger.md b/Documentation/Custom_Debugger.md new file mode 100644 index 0000000..952a15b --- /dev/null +++ b/Documentation/Custom_Debugger.md @@ -0,0 +1,20 @@ +Custom Debugger +=============== + +[WARNING to folks taking a CPS dependency](WARNING_to_folks_taking_a_CPS_dependency.md) + + +**WARNING: There is a table here that must be manually transcribed!** + +Downloading the extension and creating a project from its project template +will pop up a README that explains how to use it. + + + +TODO [andarno]: + + explain how it works. :) + + Consider renaming debugger class (or rule file) so they don't collide + (namespace is the only distinguisher) + diff --git a/Documentation/Custom_item_types.md b/Documentation/Custom_item_types.md new file mode 100644 index 0000000..b280687 --- /dev/null +++ b/Documentation/Custom_item_types.md @@ -0,0 +1,111 @@ +Custom item types +================= + +This page explains how to manually create a custom item type. + + +Initially, it may be easier to follow the tutorial documented in [Content/item +types](onenote:#Content\item%20types§ion-id={768BD288-CDB5-4DCE-83D2-FC3994703CEA}&page-id={D63703DA-87B7-4B21-88EB-22542E2999E4}&end&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo/CPS/Documentation.one) + + +This page's contents apply to all CPS projects (VC++ and Javascript). + +### Define a .xaml rule file for your item type + +The documentation for this can be found here: + +[http://blogs.msdn.com/b/vsproject/archive/2009/06/10/platform-extensibility-part-1.aspx](http://blogs.msdn.com/b/vsproject/archive/2009/06/10/platform-extensibility-part-1.aspx) + +[http://blogs.msdn.com/b/vsproject/archive/2009/06/18/platform-extensibility-part-2.aspx](http://blogs.msdn.com/b/vsproject/archive/2009/06/18/platform-extensibility-part-2.aspx) + +### Defining a custom content/item type + +CPS projects only recognize project items as source files when they have +an item type that is within a recognized set of item types. This set of +item types is defined by the project itself. Any items with types that +fall outside this set will not be displayed in Solution Explorer, belong +to source control, or appear in a collection of DTE ProjectItems, among +other things. + +To add an item type to this recognized set of source item types, a content +type must be defined for that item type. A content type is made up of an +item type and some other metadata. + + +Create a XAML file, often called ProjectItemsSchema.xaml, with content +such as: + + + + + + + + + + +### Associating a content type with a file extension + +To have files automatically assigned to your content type (and thus your +item type) when added to the project based on file extension, you may add +this tag within your ProjectSchemaDefinitions tag: + + + + +Your project must point to this XAML file so that CPS will find it and +include it in its aggregate content types map. This is commonly done by +adding a PropertyPageSchema tag to a .targets file that is imported into +your project files such as is shown below. Be sure to give an absolute or +project-relative path to your xaml file so that CPS can find it. + + + + + +### CPS native "FileNameAndExtension" property + +CPS has added support for a new property "FileNameAndExtension" that +returns just the file name with extension included. This is something not +supported directly by MsBuild. + + +To add it for a custom type, add the following property - + + + + + + + + + + + + diff --git a/Documentation/Custom_reference_types.md b/Documentation/Custom_reference_types.md new file mode 100644 index 0000000..1b3f0b1 --- /dev/null +++ b/Documentation/Custom_reference_types.md @@ -0,0 +1,76 @@ +Custom reference types +====================== + +If your project has a new kind of reference that is "resolved" during the +build (e.g. converted from some simple form that the user may recognize to +an absolute path on the machine running the build), CPS may support such +references by exporting a few interfaces, as described below. + +But consider first whether existing reference types may accommodate your +needs. + + +### Step 1. Read, write, resolve your reference type + +First it will be useful to write a component that knows how to read, write +and resolve your references by implementing this interface: + +[http://index/#Microsoft.VisualStudio.ProjectSystem.V12Only/References/IResolvableReferencesService.cs.html](http://index/#Microsoft.VisualStudio.ProjectSystem.V12Only/References/IResolvableReferencesService.cs.html) + + +An example of how CPS implements this interface for standard project +references can be found here: + +[http://index/#Microsoft.VisualStudio.ProjectSystem.Implementation/References/BuildDependencyProjectReferencesService.cs.html](http://index/#Microsoft.VisualStudio.ProjectSystem.Implementation/References/BuildDependencyProjectReferencesService.cs.html) + +Note however that this implementation relies on a base class that is not +(currently) available outside of CPS, but you can examine the base class +to see what it does if you wish. + + +As a part of this step, you should also define a new .xaml Rule file +for the item type representing your custom reference. You can follow the +steps in [Custom item types](Custom_item_types.md) except do not add your +new rule to the ProjectItemsSchema.xaml file as your reference does not +represent a source item. + + +### Step 2. Add a tab in Reference Manager for your reference type + +To support the Reference Manager dialog, you will need to export this +interface: + +[http://index/#Microsoft.VisualStudio.ProjectSystem.VS.Implementation/References/IVsReferenceManagerUserAsync.cs.html](http://index/#Microsoft.VisualStudio.ProjectSystem.VS.Implementation/References/IVsReferenceManagerUserAsync.cs.html) + + +An example of how CPS implements this for standard project references can +be found here: + +[http://index/#Microsoft.VisualStudio.ProjectSystem.VS.Implementation/References/VsProjectReferencesProviderContext.cs.html](http://index/#Microsoft.VisualStudio.ProjectSystem.VS.Implementation/References/VsProjectReferencesProviderContext.cs.html) + +Note however that this implementation relies on a base class that is not +(currently) available outside of CPS, but you can examine the base class +to see what it does if you wish. + + +### Step 3. Make your custom reference type appear in Solution Explorer's References node + +Currently the References node in Solution Explorer is not extensible to +new types of references. But if your custom project type has only your +custom references, this isn't a problem as you can supply an entirely new +References node. + + +You can define a References node by following this example of how CPS +implements one: + +[http://index/#Microsoft.VisualStudio.ProjectSystem.Implementation/Designers/ReferencesProjectSubtreeProvider.cs.html](http://index/#Microsoft.VisualStudio.ProjectSystem.Implementation/Designers/ReferencesProjectSubtreeProvider.cs.html) + +And yes, this time the base class is public. :) + + +### TODO + +Cover DTE, vslangproj access to references. Any other places in CPS where +the types of references are hard-coded? + diff --git a/Documentation/Early_Drafts.md b/Documentation/Early_Drafts.md new file mode 100644 index 0000000..da38028 --- /dev/null +++ b/Documentation/Early_Drafts.md @@ -0,0 +1,3 @@ +Early Drafts +============= + diff --git a/Documentation/Extensibility_points.md b/Documentation/Extensibility_points.md new file mode 100644 index 0000000..a0cab0d --- /dev/null +++ b/Documentation/Extensibility_points.md @@ -0,0 +1,87 @@ +Extensibility points +==================== + +General guidance for extension authors +-------------------------------------- + +Understand the threading model + +CPS extensions are expected to conform to the [CPS/VS threading +model](Threading_model.md). Please become familiar with it before writing +CPS extensions. This will help avoid responsiveness issues, deadlocks, +and non-deterministic hangs in your scenarios. + + +We promise we won't bite + +Please send a code review to the CPSCR alias when introducing or significantly +modifying CPS extensions, particularly for your first few extensions so +we can help catch common mistakes. + + +### [AppliesToAttribute](http://index/Microsoft.VisualStudio.ProjectSystem.Utilities.v14.0/R/a40aabc698b937e1.html) + +Every extension based on MEF exports must include an [AppliesTo("…")] +attribute on the exported type or member. The string argument is +an expression that evaluates to a boolean value, as [documented +here](http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.ivsbooleansymbolexpressionevaluator.evaluateexpression.aspx). +The terms that may be used are [project +capabilities](onenote:Documentation.one#Project%20Capabilities§ion-id={768BD288-CDB5-4DCE-83D2-FC3994703CEA}&page-id={6345DC31-A083-4A4B-BBD9-38F17BE3EF62}&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo/CPS). + +Take care to write the appropriate AppliesTo expression so that your +extension applies exactly to the set of projects you mean to impact. Remember +that although your expression may seem to work based on it lighting up for +your intended scenario, it may also be lighting up for unintended projects +that you're not testing. So test positive and negative cases, and ask the +cpsfriends DL for review of your appliesTo expression. + + +Even if your extension uses code to effectively no-op for project types +that are not appropriate, doing so requires that the assembly containing +your extension be loaded and initialized in the process. It is best to +use the AppliesTo attribute effectively to prevent your assembly from even +loading when it does not apply to a given project. + + +### [OrderPrecedenceAttribute](http://index/Microsoft.VisualStudio.ProjectSystem.Utilities.v14.0/R/68b045852438c9bc.html) + +When more than one extension applies to a given project, CPS may pick the +"most preferred" extension to fulfill some requirement, or it may loop +through all extensions to allow each to participate. The preference order, +or the order of that loop, can be influenced by adding an [OrderPrecedence] +attribute to your export. + +Lacking any such attribute on an export, the sort order value is effectively +0. When setting a nonzero value to your export, consider future requirements +of yourself or others to sort themselves above or below your export. Choose +a value that is larger than the values of those extensions you are trying to +supersede, but lower than the values of other (possibly future) extensions +that need to supersede your own extension. As examples, a common value to +use to override default behavior is 1000. When superseding another export +with a value of 1000 you may consider using 2000. Later if an extension +needs to be placed two other known extensions that use respectively 1000 +and 2000, you could use 1500 as your value. And so on. + +No extension should use int.MaxValue or similar very high values in +an attempt to force their own extension to be non-overridable. Future +requirements are not yet known, and you or others may need to override +your extension, and you should leave ample room in the value space to +supersede your extension. + +Typically you may omit this attribute from your exports until you discover +a need to supersede behavior defined elsewhere. + + +### Troubleshooting + +#### When a CPS extension isn't invoked + +Following are some things to check for when you have a CPS extension that +doesn't get invoked when you expect it to: + +- Verify that the assembly containing your extension is included in the VS MEF catalog. + - Is your assembly referenced from an extension.vsixmanifest file that is found in the VS install directory in a location that VS searches for extensions? +- Does your extension have an [Export(typeof(IExtension))] attribute or another Export-ish attribute as documented for the extensibility point? +- Verify that your export defines an [AppliesTo] attribute on the same type or ember that the [Export] attribute is found on, and with an expression that is appropriate for the project type(s) you are targeting. In some cases this may mean you have an [AppliesTo] attribute that appears both on the type (that is exported) and a method (that is also exported). +- Verify that your MEF part isn't rejected due to some authoring error by scanning for it in this file: +%localappdata%\microsoft\VisualStudio\14.0\ComponentModelCache\Microsoft.VisualStudio.Default.err diff --git a/Documentation/External_customer_guidance.md b/Documentation/External_customer_guidance.md new file mode 100644 index 0000000..b966dac --- /dev/null +++ b/Documentation/External_customer_guidance.md @@ -0,0 +1,80 @@ +External customer guidance +========================== + +CPS breaking changes in Dev14 +----------------------------- + + +### Exports + +Replace uses of: + + [PartMetadata(ProjectCapabilities.Requires, "…")] + +With: + + [AppliesTo("…")] + + +If you have any class members that are themselves exported, you should +add the [AppliesTo] attribute to each of those members as well to match +the one that appears on the exported class (if any). + + +### Imports + +Imports of IVsHierarchy, IVsProject, or IProjectConfigurationService must +be changed from: + + [Import(x)] + + Lazy ImportingProperty { get; set; } + +To: + + [ImportMany(x)] + + OrderPrecedenceImportCollection ImportingPropertyCollection { get; + set; } + + + Lazy ImportingProperty + + { + + get { return this.ImportingPropertyCollection.First(); } + + } + + +For any ImportMany of OrderPrecedenceImportCollection that you introduce, +you must add a line to your importing constructor: + + + [ImportingConstructor] + + YourExtensionClassName(ConfiguredProject project) + + { + + this.ImportedExtensions = new OrderPrecedenceImportCollection(projectCapabilityCheckProvider: + project); + + } + + +### Changes that apply to only certain kinds of exports + +#### IDynamicEnumValuesProvider + +Replace this pattern: + + [Export(typeof(IDynamicEnumValuesProvider))] + + [DynamicEnumCategory("…")] + +With: + + [ExportDynamicEnumValuesProvider("…")] + + diff --git a/Documentation/Finding_CPS_in_a_VS_project.md b/Documentation/Finding_CPS_in_a_VS_project.md new file mode 100644 index 0000000..ed8bb40 --- /dev/null +++ b/Documentation/Finding_CPS_in_a_VS_project.md @@ -0,0 +1,122 @@ +Finding CPS in a VS project +=========================== + +Caution: CPS has no stable public API of its own. Any references to CPS +assemblies or types therein can be counted on to break with each successive +release of Visual Studio until we can take time in our schedule to stabilize +our API. Sorry. + +[How to detect whether a project is a CPS project without risking being +broken in the next version of VS.](onenote:Design.one#How to detect whether a +project is a CPS project without risking being broken in the next version of +VS.§ion-id={89E1E997-B6E7-4F3E-A523-20563FE2C7D4}&page-id={5FAF7DCD-81F8-4C12-BB1B-B770504694E1}&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo/CPS) + + +Note: These instructions are intended for clients who are not MEF parts +themselves. MEF parts that need access to CPS APIs should simply [Import] +the services they require. + + +#ref Microsoft.VisualStudio.ProjectSystem.v14only.dll + +#ref Microsoft.VisualStudio.ProjectSystem.VS.v14only.dll // may be useful +after acquiring CPS + +#ref Microsoft.VisualStudio.ProjectSystem.Utilities.v14.0.dll // may be +useful after acquiring CPS + + +using Microsoft.VisualStudio.ProjectSystem.Designers; + +private UnconfiguredProject GetUnconfiguredProject(IVsProject project) { + + IVsBrowseObjectContext context = project as IVsBrowseObjectContext; + + if (context == null) { // VC implements this on their DTE.Project.Object + + IVsHierarchy hierarchy = project as IVsHierarchy; + + if (hierarchy != null) { + + object extObject; + + if (ErrorHandler.Succeeded(hierarchy.GetProperty((uint)VSConstants.VSITEMID.Root, +(int)__VSHPROPID.VSHPROPID_ExtObject, out extObject))) { + + EnvDTE.Project dteProject = extObject as EnvDTE.Project; + + if (dteProject != null) { + + context = dteProject.Object as IVsBrowseObjectContext; + + } + + } + + } + + } + + + return context != null ? context.UnconfiguredProject : null; + +} + +private UnconfiguredProject GetUnconfiguredProject(EnvDTE.Project project) +{ + + IVsBrowseObjectContext context = project as IVsBrowseObjectContext; + + if (context == null && project != null) { // VC implements this on +their DTE.Project.Object + + context = project.Object as IVsBrowseObjectContext; + + } + + + return context != null ? context.UnconfiguredProject : null; + +} + + +#### To obtain the ConfiguredProject + +UnconfiguredProject unconfiguredProject; // obtained from above + +var configuredProject = await unconfiguredProject.GetSuggestedConfiguredProjectAsync() + + +#### Obtain CPS services + +The easiest way to obtain CPS services from an UnconfiguredProject or a +ConfiguredProject instance is to use either of these interfaces' Services +property, which provides access to the common CPS services for either of +these scopes. + + +If the service you want isn't exposed on the Services property directly, +you can obtain arbitrary exports using the Services.ExportProvider property: + + ConfiguredProject cp; + + IOutputGroupsProvider ogp = cp.Services.ExportProvider.GetExportedValue(); + + +To test for whether a given project is a WWA project + +Rather than using ProjectTypeGuid, please use the above method to detect +CPS, then check the UnconfiguredProject.Capabilities property for the +presence of the "Javascript" and "WindowsAppContainer" capabilities. + + +To test for whether a given project is a Shared Code Master project + +using Microsoft.VisualStudio.Shell; + +public static bool IsCodeSharingMaster(IVsHierarchy hierarchy) { + + return hierarchy.IsCapabilityMatch("CodeSharingParentProject"); + +} + diff --git a/Documentation/GetMkDocument_returns_12_style_strings.md b/Documentation/GetMkDocument_returns_12_style_strings.md new file mode 100644 index 0000000..04f3b9f --- /dev/null +++ b/Documentation/GetMkDocument_returns_12_style_strings.md @@ -0,0 +1,25 @@ +GetMkDocument returns ">12" style strings +========================================= + +The [GetMkDocument method is +documented](http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.ivsproject.getmkdocument.aspx) +as being required to return the full path to any item that represents a +file on disk. In Javascript projects, not all items represent files. For +example, the References folder, and items within it, do not represent +files or folders on disk. Therefore the GetMkDocument returned value is +left up to the project system as an implementation detail. Clients who +call GetMkDocument should therefore not assume that the result is always +a filename unless they already know that the item they’re asking about +represents a file. + + +Callers that intend to parse the string returned from this method should +not attempt to do so without first calling IVsHierarchy::GetProperty(itemid, +__VSHPROPID.VSHPROPID_TypeGuid) to check that the result is either +VSConstants.GUID_ItemType_PhysicalFile or VSConstants.GUID_ItemType_PhysicalFolder. +If it is either of those two values, it should be safe to expect that the +GetMkDocument returned value is a file or folder path. But if the TypeGuid +property is neither of these values, the result of GetMkDocument must be +interpreted as an opaque string, useful only for passing into other methods +of that same project such as IsDocumentInProject. + diff --git a/Documentation/HOWTOs.md b/Documentation/HOWTOs.md new file mode 100644 index 0000000..6c02bb4 --- /dev/null +++ b/Documentation/HOWTOs.md @@ -0,0 +1,3 @@ +HOWTOs +====== + diff --git a/Documentation/Hide_some_of_the_tabs_in_the_Reference_Manager_Dialog.md b/Documentation/Hide_some_of_the_tabs_in_the_Reference_Manager_Dialog.md new file mode 100644 index 0000000..b24a6a0 --- /dev/null +++ b/Documentation/Hide_some_of_the_tabs_in_the_Reference_Manager_Dialog.md @@ -0,0 +1,21 @@ +Hide some of the tabs in the Reference Manager Dialog +===================================================== + +The tabs in the Reference Manager are driven by CPS extensions. These +extensions are in turn driven by [AppliesTo] attributes. Therefore you +can hide tabs from Reference Manager by suppressing the declaration of +the corresponding Project Capabilities in your project. + + +In other words, if a tab shows up in Reference Manager that you don't +think should be there, it's because your project declares that it supports +that type of reference. Remove the project capability and that tab will +disappear. + + +- Open CustomProject.targets +- Remove the capabilities that correspond to the tabs you would like to remove (e.g. WiRTReferences) + + + diff --git a/Documentation/How_to_add_a_fast_uptodate_check.md b/Documentation/How_to_add_a_fast_uptodate_check.md new file mode 100644 index 0000000..39edb27 --- /dev/null +++ b/Documentation/How_to_add_a_fast_uptodate_check.md @@ -0,0 +1,6 @@ +How to add a fast up-to-date check? +=================================== + +Export the [IBuildUpToDateCheckProvider](http://index/#Microsoft.VisualStudio.ProjectSystem.V12Only/Build/IBuildUpToDateCheckProvider.cs.html) +interface. + diff --git a/Documentation/How_to_create_a_new_CPSbased_project_type.md b/Documentation/How_to_create_a_new_CPSbased_project_type.md new file mode 100644 index 0000000..4c15876 --- /dev/null +++ b/Documentation/How_to_create_a_new_CPSbased_project_type.md @@ -0,0 +1,63 @@ +How to create a new CPS-based project type +========================================== + +If you want to create a new type of project (typically associated with +defining a new file extension for your project such as .booproj), CPS +may be able to greatly reduce the cost of creating and maintaining such +a project system as has historically been the case. + + +Prior to CPS, options for defining a project system mostly were focused +on [MPFProj](http://codebox/mpfproj). Project systems are quite often +100,000s of lines of code. The bugs never end, and each release requires a +great deal of work merely to keep up with the new features of the IDE that +require investment of each project system in order to keep a consistent +experience for all project types. CPS ends this by being a built-in project +system that may serve many project types. This means that you can get +started with your own project type with literally as little as one small +.pkgdef file. Beyond that, the cost you pay is limited to exactly those +aspects of the build and project systems that you wish to customize from +reasonably standard behavior. + + +We have created project and item templates to help you get started +with your own project type and some common customizations. These aren't +yet published, and we're hoping to find time to finish them. Even +so, several project types have been defined based on CPS successfully +already. In the meantime, please email the vscpsfte@microsoft.com +alias with your interests, and check out some of our [brownbag +videos](file:///\\andarno3\public\CPS%20Brownbag%20videos), particularly [one +where we discuss an overview of project systems and demo these project and item +templates](file:///\\andarno3\public\CPS%20Brownbag%20videos\2012-09-21%20Review%20of%20the%20Common%20Project%20System%20(CPS)%20-%20Andrew%20Arnott,%20Cliff%20Hudson.mp4). + + +Join the [Common Project System (CPS) +Friends](http://idwebelements/GroupManagement.aspx?Group=cpsfriends&Operation=join) alias. + + +The VSIX to install that helps you (w/o any consideration for Razzle) +create new CPS-based project types can be found here: + +- Install the [VS SDK](http://www.microsoft.com/en-us/download/details.aspx?id=40758) if you haven't already. +- Install the [CPS SDK VSIX](file:///\\andarno3\public\CPSSDK\Dev14) + (Source code for the CPS VSIX: + [https://vspnb.visualstudio.com/DefaultCollection/_git/CPS#path=%2Fsrc%2FNonShipping%2FVSIXes%2FCPSProjectSystem&version=GBSDK&_a=contents](https://vspnb.visualstudio.com/DefaultCollection/_git/CPS#path=%2Fsrc%2FNonShipping%2FVSIXes%2FCPSProjectSystem&version=GBSDK&_a=contents)) + +- Launch Dev14 (depending on the version of the SDK you installed) +- Open the New Project Dialog +- Set the target framework to .NET Framework 4.6 +- Select "Project Type" from the "Visual C# -> Extensibility" node. +- Complete the new project wizard. +You've got yourself your own project type. You can press F5 to launch the +Experimental instance of Dev14 and see your new project appear in the New +Project dialog now. + + +Now you can customize it. Notice the Add New Item dialog has several +special templates for adding extensions that customize the behavior of +your project type under the Extensibility category. + +Note: This VSIX is not yet fully supported, and it does not represent the +full functionality or all the extensibility points available to CPS based +project types. + diff --git a/Documentation/How_to_detect_whether_a_project_is_a_CPS_project.md b/Documentation/How_to_detect_whether_a_project_is_a_CPS_project.md new file mode 100644 index 0000000..41d21a2 --- /dev/null +++ b/Documentation/How_to_detect_whether_a_project_is_a_CPS_project.md @@ -0,0 +1,24 @@ +How to detect whether a project is a CPS project +================================================ + +The following code snippet demonstrates how to detect whether a given +project is a "pure" CPS-based project system (e.g. Javascript, and not VC++ +which is only half CPS). This technique does not require referencing any +CPS-specific assemblies, and therefore has the advantage of not risking +having breaks with subsequent versions of Visual Studio when CPS changes +its unstable API. + + +using Microsoft.VisualStudio.Shell; + + +internal static bool IsCpsProject(this IVsHierarchy hierarchy) + +{ + + Requires.NotNull(hierarchy, "hierarchy"); + + return hierarchy.IsCapabilityMatch("CPS"); + +} + diff --git a/Documentation/IFileSystemErrorMessageProvider.md b/Documentation/IFileSystemErrorMessageProvider.md new file mode 100644 index 0000000..e633034 --- /dev/null +++ b/Documentation/IFileSystemErrorMessageProvider.md @@ -0,0 +1,12 @@ +IFileSystemErrorMessageProvider +=============================== + +This interface may be exported to the UnconfiguredProject scope to supply +alternative messages to display to the user in the event of certain file +I/O errors. + +For example, if you have an out-of-proc design-time component that may lock +files and cause common user operations to fail, you may want to customize +the error message to help the user understand what they need to do to +unlock the file to unblock the operation. + diff --git a/Documentation/IProfilableProjectProvider.md b/Documentation/IProfilableProjectProvider.md new file mode 100644 index 0000000..316ef57 --- /dev/null +++ b/Documentation/IProfilableProjectProvider.md @@ -0,0 +1,19 @@ +IProfilableProjectProvider +========================== + +The IProfilableProjectProvider interface can be exported to provide +functionality for the IVsProfilableProjectCfg interface in Visual Studio. + + + [Export(typeof(IVsProfilableProjectCfg))] + + [AppliesTo("MyProjectType")] + + internal class MyProfilingProvider : IVsProfilableProjectCfg + + { + + // implementation of IVsProfilableProjectCfg members: + + } + diff --git a/Documentation/IProjectPropertiesProvider.md b/Documentation/IProjectPropertiesProvider.md new file mode 100644 index 0000000..95257fb --- /dev/null +++ b/Documentation/IProjectPropertiesProvider.md @@ -0,0 +1,14 @@ +IProjectPropertiesProvider +========================== + + +### Notes + +This should not be used to add user input validation. User input validation +should be done inside your MSBuild targets at build time. Remember that users +may set properties to $(Macros), use conditions, etc., that make it difficult +or impossible for you to truly validate user input at design-time. [Custom value +editors](onenote:Documentation.one#Property%20value%20editors§ion-id={225839EC-68C9-40B3-AD41-FD0EC362CEDE}&page-id={ED60D113-DC4C-49FD-B75D-019E13934728}&base-path=https://microsoft.sharepoint.com/teams/vsprojectsystem/Shared +Documents/VS Project System Documentation) can help you guide your customers +to create valid input. + diff --git a/Documentation/IProjectSourceItemProviderExtension.md b/Documentation/IProjectSourceItemProviderExtension.md new file mode 100644 index 0000000..d013294 --- /dev/null +++ b/Documentation/IProjectSourceItemProviderExtension.md @@ -0,0 +1,33 @@ +[IProjectSourceItemProviderExtension](http://index/Microsoft.VisualStudio.ProjectSystem.V14Only/R/90124dbaa6314d68.html) +======================================================================================================================== + +This interface may be exported at the ConfiguredProject scope to intercept +project item manipulations. For example, if you want items to be added, +renamed, or removed from a custom imported project file instead of the +root project file (the one the user opened in VS), you should export this +interface to do so. + +Note that Shared Projects already have this behavior by exporting this +interface under an AppliesTo expression that evaluates to true when the +"SourceItemsFromImports" project capability is present. + + +For example: + + + [[Export](http://index/System.ComponentModel.Composition/A.html#a2a14721c3852bea)(typeof([IProjectSourceItemProviderExtension](http://index/Microsoft.VisualStudio.ProjectSystem.V14Only/A.html#90124dbaa6314d68)))] + + [[AppliesTo](http://index/Microsoft.VisualStudio.ProjectSystem.Utilities.v14.0/A.html#84c3c630297dcc4b)("YourUniqueCapability")] + + public class +[YourProjectSourceItemProviderExtension](http://index/#Microsoft.VisualStudio.ProjectSystem.Implementation/Items/ImportedProjectSourceItemProviderExtension.cs,fd7236653bc03381) +: [IProjectSourceItemProviderExtension](http://index/Microsoft.VisualStudio.ProjectSystem.V14Only/A.html#90124dbaa6314d68) + + { + + // implement interface here + + } + + + diff --git a/Documentation/IProjectTreeModifier.md b/Documentation/IProjectTreeModifier.md new file mode 100644 index 0000000..09e5f30 --- /dev/null +++ b/Documentation/IProjectTreeModifier.md @@ -0,0 +1,18 @@ +IProjectTreeModifier +==================== + +The IProjectTreeModifier interface can be exported into the ConfiguredProject +scope to apply cosmetic changes to a project tree or one of its nodes. This +allows you to, for example, set the icon on your project's root node to +be consistent with your branding. You can also set the icons on specific +source items that are may be unique to your project type. + + +Do NOT use this to modify the structure of the tree. Adding, removing, or +moving nodes in the tree in a modifier will most likely cause malfunctions +in the project system. + + +You can create an IProjectTreeModifier export using the "Project Tree +Modifier extension" item template included in the CPS SDK. + diff --git a/Documentation/IProjectTreeProvider.md b/Documentation/IProjectTreeProvider.md new file mode 100644 index 0000000..9b10810 --- /dev/null +++ b/Documentation/IProjectTreeProvider.md @@ -0,0 +1,3 @@ +IProjectTreeProvider +==================== + diff --git a/Documentation/IPublishProvider.md b/Documentation/IPublishProvider.md new file mode 100644 index 0000000..19b1d83 --- /dev/null +++ b/Documentation/IPublishProvider.md @@ -0,0 +1,61 @@ +IPublishProvider +================ + +The IPublishProvider interface can be exported to provide functionality +for the IVsPublishableProjectCfg interface in Visual Studio. + + +Make sure you have [AppliesTo("xxx")] attribute on your exported type. +"xxx" is your project type. + +Sample code below: + + + [Export(typeof(IPublishProvider))] + + [AppliesTo("MyProjectType")] + + internal class MyPublishProvider : IPublishProvider + + { + + [Import] + + private ProjectProperties Properties { get; set; } + + + + public Task IsPublishSupportedAsync() + + { + + return Task.FromResult(true); + + } + + + + public async Task PublishAsync(CancellationToken cancellationToken, +TextWriter outputPaneWriter) + + { + + await Task.Yield(); + + } + + + + public Task ShowPublishPromptAsync() + + { + + return Task.FromResult(false); + + } + + } + + + + diff --git a/Documentation/IValidProjectReferenceChecker.md b/Documentation/IValidProjectReferenceChecker.md new file mode 100644 index 0000000..bcd3ad7 --- /dev/null +++ b/Documentation/IValidProjectReferenceChecker.md @@ -0,0 +1,3 @@ +IValidProjectReferenceChecker +============================= + diff --git a/Documentation/Images/Fig.png b/Documentation/Images/Fig.png new file mode 100644 index 0000000000000000000000000000000000000000..080276ce765151eef1c7b1cb8e6d0f552b58e751 GIT binary patch literal 112055 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 literal 0 HcmV?d00001 diff --git a/Documentation/Images/Fig_2.png b/Documentation/Images/Fig_2.png new file mode 100644 index 0000000000000000000000000000000000000000..1ae2b9a84f3db411a101decc82a2e005b8c9831a GIT binary patch literal 29984 zcmb@tXH=70*Y_K@A}R_Zib@qhkq%Nr-GYFC6zM%e=t%Ef={0l+U8MKkq=}SJLT`c; zX#uH12oPG%72M^%pYx0}#u@MX!6Ag}T4k=a=K9V5oC#4~XzW{+MB8g572!P+O+rH9r0D*|V;{RQ`_e}OZ2;}%x z=H&}jSN*N#og%L(ulZG^tbzkm8? zf|cs{EsCTo{=cYGm^HcL@(Y6Vpy6?0(zntclgZJ=uRMK4ArTxeAR8{xMI5r?IXhU^ ze4uT)g*#>)*O@}m)*mW$@q|WZZ-c(vH*)^}JRrX>@=$HO zn0eKmNv-P60-W@sC+s~1aF#5*(7rTLnU{qW_V8jjX^;lFfj%Ks@Z=fhe%E&Qd7;UZ zuUz!_o-=DLw&0Qtk^_Cx`N{Fu5aG9vhZUQ5JX%)06kD_rL|&NHd8`P>xzasHHnryS zPwygkPRA@IZKcH!GSXnnAnEP_o;MkLqLnmrm}3U-s9y7%JZ^T5{WC4v1Zro^cdumz z-OFe@P&BT8<6Kzi_j`u<9?b{Kmv=l?32C15BLq>?VRcT(vX+e(8}s7NgGf$KBi*$W ze?7}{%|d!kM%VMM1L40~A& zw|w9sMf7C433_l+hGnW7r~m%)p@Izv7u8fkB8ZA;1%`B1-Fnf4QiI-q49Xz{Q_=Xo zOa%L7S$bieFZEEwt=aLjP+`nh;Q&PF+ZFg0Up5&(yLK_&Q&T;=*z-4JuEs%W1kQk9Fi|FVop@V1$tR zgmnuwLiIXG5OoVbBnM#02$}eM-LThwFXy_>k`?%n2O94lwoEyOfvH2K)!1F=^j}@K z5Z$vMj&v)qljUAg(9@oC8+I=6v3ahU!6^})%kg!yVN+dDMaBI|KS#@sUJrCivnTpK zbVYA7HdGZ)&Jhr+ZoVz0ERl z?q6dPl3Kx&n2%lDn1OcHpTSI`+_=pa?}_%2>OQxpTTn8zXy1#l>fLxqvc$+&BX>`x z+u|hMH_`MW@pkNg89+0O4NhfZ@|9O`mRc>x9vx>r7SZG0SlZR}$~xTWV_PMw>(tkc zWpLQpeX=69;nQa^vCjr(a~xiU_shBDpbMs95|Jv}$p^0;MrZuPCXIq!ao7~K7UEBv zIq96~uZ+~Am3)9LwU+wt(aVPvK;cnI@n7TO6kIY3Rey?)L3Ovb(Hy9IpUKQ z)y~))O2=gA+?d>l+k$!jdWUtjD)m487T%3XFyJz;8dl#GDzuN7U?Z9P ze0WdnRypzLO$@J(EwP_0BDLfRbxv90A9Riiz!_Ek?P$gd#t4y`5*T*B*z!vBB1wFt z{$@T!PD}Q4MN~K1$c0%UT~~o4LyfIJRpDJQ@&KZ+xl2{`3R3i8-E(7ycJefyj zKALE`hkM1hcBFAo_*Bk;Gi@C%spAIhoK@8oU5*?J^~Y4);@9-_QQs(ZDtd4?g}Xim zh2e)1fOmF7IlK)kQ-8YSYMuv7nvvn((_p%ILE(6PM_gaid(yGZ~UU=F>wKt zYU`Dv3tyfeV2d=H?bQG#O6RXcv;ZIe9A9SQ&zEI$HqVikUnt?Py;e7O>O(qRzBdko zN^PjOB$G~uckG?#iD4Iqzj9?EqBTRs2){i88f983!rs8>;0DDcDb+E~8E=5kZY;nJ z+I0h<=V@i0sDPBj?Up?Zv$ub7kqZvF0Z|NK&KyZMH)HG7K;M&nt>(G+)*s}3b=^pLcslO zR>)bo@;1CVK8leQuq2I&fJwbc%YF{WS#Q~CFGBR70&<)KIVQyYpgo<+IMY(yly*R{ zI%B6y=dm!CrmWCaU`h^5kbaG4ROmqPFc+fDmt<}MzVw#3pc9zvUD(6Y1jtDZC%vxqqDg^zJ(o0Y++dPK5C~u-%D&g-LmmHaq&5H@!4MWR(PC&J6)xRl28bu zj1t9;+DLj)`r{~OYP7uTyavSHuZSSbsHX;zMzLc4VpQKtMz>zlTHjTTzRYWRmOplG z$UVLcRnUTI$f(9O$KYI!dj`Ev6bq+CFeNs)uE^OY+!91I*KHf#icXt^oR&trcrRwW z?4*ijkvY-3UhL2hgPINc!LWB%VBkbTTENO8FlNL%7|UrQK)?9x=*BOCNYhqy?#`Ly&KX*Um3(5_T16#UtIj#CToF1 zF*@r5R4U&YX%IWmfZOCVRS$!T+P^$3SN_%5*Tc>T6Gcp2iMVxGrGp-h^j1CHZN>8A zp2BX0T(c`DETKX}j$3v-5JGbXVqn#DuY)OOy2PmoNyH`?Z|6l9h-(e<4gcn?`J<#& zBrQn|)S!FU`_ny`TUM`zLynEtHlxklNe>6Ly(M;-s*2`3RAk^z0j6yB2r4(>_z$IuHBfcMY$+z#tyVWCg(o6;bTZp|Ghz*m$Kw!;PO2~8 zuPZ`)JDB*j?Clvncx`3%e7LE&aLK0Zolv_K0kLozS%h$!XXx5n32lYBnF7HO|AlY{ z28{CUK=b?8C5Jx8$E@o3*z?c~+{#0wKSIR(SmyU)lZt|O}*_0s~Az`KUz~+r5OV}^fuBX7Rltnq(c>lQHs(uC2<#2j! z5wTfXMY%}pfjy&fwAMe5s0a~44N6M<{G~I0K8=|7SnB6(E5W9|m|uYt_7xkm3EqjS z{GT>d9yT_oc<&%`wuFEwnd9 zsm*!Dn2bjYIGIp{@YID%Bx|_mzC}#Gp`v7}&-!T2=N4u*d1p98!JTYRecWJ9hT?@j z3zNImYazwp$t-wy>|-~zHwOz0QO(z`_l4hg=;>2%pYUV04jK{tY%e^;YIYz-ITc)j z74li#=^mmzTa)&|9r{3sJK1rV*7M0Hd()O>ZsH2h`y2Gg)qlXNR@oQTD{!?Lq7bfA zRV$PEqq+aljd#neIJFPg=75Y?6i--CccYkZ{ zvTP%j!{<)nyTa^u(*<f@+XgxmApNF~_qjn^Z07DAPIZe;|$NEeomws!`CGxf|~ zE}vDFR>EY$-sy@>2C`ZqdBO1|Va8DI(Pu>3dkR+~ z>#N3`6Hsa)o^cDd(=rUm1oTtB=EW!Y8YM)@ybjlV~2G%nwV>#`bOZ>YgX` zIzQ99r(Q2>8+a+~hg;9q-hTRS<`4LAF0kih=Z|L?9a1a@X~Pb0wWiFVyt+$hn*J#t|x#@X3lN{%tSicX1V(EgA=&rGlG|UWL?E z$Js{@o4++(E3BaOv)->RZk05-T38E#GMd~&Oc#(;y)t+f^bsR0+I-tvfqCC{l_#{c zx5v_G4IMmxO7?E87}rpF-$;AzrFL8m2AQM2&a=o}9GKE{?Yd0dft?a>btVJcT|fDN zHQ~12bPX{neVjKVT27WU&^d%L5VwiKJmR~{MeMl>NksNl&h7ak?F355&_LaX5 zodAklI2lU5Uu)lY(sI3db;kSAZtrU4-$V5_no@Zf)`|vr#|BPF?Qk^H)4UK@F3|uT zSZN~+0Gt{-sYC|5f%K!_>;Yi0G&hARv@ZQh2twF?i3pq2pf0eFb}-2*D_>A1ad zPXLQ;fS&=p{KjbtoViSqC%HGQG{?VtNda8R%#iR$<}DV;7NHQT6;%Ixk04@*k0Igk zr5g2P|J#C+0w$Uw!gqS$f=r+HeEVMV&!`nW)#Kl!^Sf}nxk^-WM`6$(O=kDZ^o+A5HOCJuejReM+dxEv|3 z3am+_Ko1v(mTmo2TOMUdHZY+N1pT~I== zK0|(n4e)Zv^*9uwl%4G%`lN>mHS%e1&t56DB%E2=P*iwKv=?vFKcg$C+c!13Goffl zKEa=Qi;5fcWr_ZG>m^X<#?$k|R-E3ByM{mNw$RUkk+XukF)L1e7Fx2Q8pfvYcuV%U zP}EgAE5G_ld5bfUWQtw!pD@hPDLi{-alG&PODMNUDQxqh0~xsj8sMuS(Aw3h;{!V+ zRwT@}r&Ef;%<; z6b!SWc$kpO)@k>1Rj&3K35iB{i&MURafW-ufOq&4rb6hoswS)^Uru*z<3LyyMen%Q z7q{OVq7t*U1Shk95*LP|*S&EzLQQz;eK$2k9R{xJBM~yub39P>o01E=%hDreQrpqx z%KSYBgE2ir3Zm$kVBFc_l;39;uierV!}Kb&yTO#k*y9MyS4|g!Y}tvOkZi%1K%mbr zYFk*GkW914!&PPsD0g#&cO-HP>vzlk6k>eUfLOcF(U0pPH zaSG*GzFW5bl!A72LUG8OiZA7ryz;Wsg}PHTJwYjKeTT1T-2J%iQ=#7Ie*O%fb2pz# z@f!fjc`R8qQ(XpxSHE{&2r#N?b5e!vTfj(J60}5L3e(FZFRW7bi3Du&!d~RXv>XxB zvWC&lkj!r3W_U@inrPPyuU;(1VsJ;=D%8>r36gg3hm!kjdh@R;jc%4SQC$}9pvCQ$ z`8+#oo#;O~M~R&;<$vp;#VxgBTbg4{E9}JfH+(!jN$!oLWk`yn?mK}dBZ}ud8@hs) zsuh#GI!uyr6_||-(xS*K*L_|^dY?(q9y>(}nBwyJBx_r;s2wU>4@6iOt0(-x9@8Cd z16}+P`H1Qdfpqi^!ILWnYr}QKYA{R|iWe4fI$K49@o!}L-l z2yj({q%iQT-azzQRa%9cziwlVo$CM0z>WxbtSBTdOigEjZEQf1em)e7Uv5@=@-6<* zM2Wc^)6ohgwzq--Um+HSN)cJ)InL)32iBOnN=Wp?phD=+3SX#|YGH;#n_u}k_UxGe zBi_eK3!r{=lYKh2HGCh`UFI868jRN1=1W|V$^#AE<*q!o8`}Fd{Hri4$(#IiyV8*w zaXIE0IU{~sW<^@i8*Kkuim%nxCvQBdZtexI?g}q~ z%mXQ+r6ML#zix~y$9O+MhRpNg7$mSr!2M91E(a{L41Stwobk=SGD)zr&sqn%B3DoC zb*d>WM5Ziwd6wl&;&SvYs5f5hZA=%|Jy@Ik?R>C7?4coA5K#k>@Z?YJV?Fz-ty`n8TX=u|9qscG5%%%qzF?t z=5`%7@Kx8~)5^m8JZ#6EieVDI`gdxCOF!3k360C{*$29&<1ApbpSmDRn1B>}< zBXy2^i1M<#0i|#IijtLa2SMX{#H2z|1j=_J9xFbl^SCr)+}L$mN54^NpkUEiApFyU zp#WVW3VZF@jNToCrEV8KK0lEaI;A_srscFL<=xkqL3GM%yvH?|6{>ZNms z=@xc2Pnnva{Gujo_qjLVLD>QWQ8%oF4=psU|6FS2ZEF2jox5t4*^GM<&+xuPLsOqgu-r-{X;DZL;Hv6 zKT8VJm{wmep=d?->Cm^`;kVwTD_pt69?;lRO`I2|HCahTLZtDyy;r{BCtAa^^3I*U zTSW{f^S!@l+g^>T#skZQeS@hA_H&@unIDEdeCveAhIc(&8=3lkTibn`_w4e=ui)Yz zl|%$X-meIZ3npYG8ZfQasM&P>NwktWRqsDCl>Uf#I_TB;TX%9$WH{SbJ4|jT>paw$ zm^O)PFOx(P#yipd3l|iY5$#!^W2nmd_AGTFi+P^jZLNf$60-o$r2UIuw(Zh1^xZoB zU{q28q{Gc22GdcHmu0jWMTuxjFzDUQ-yBoqg8ZrYWexY5q}9GL<&>o6%T<8^Ad2PD zaMt>Dbl$;f^{Osn@hEgy$Y4qpaIBP4wW3tq`|Y2pt8lqnTg#C_J691+Trg*(uj@*I z9=Y&*553&V1Juk>q~Yk&!^v=5>gQx;z!dGjNk_8+I)F<{_xr+S6RtvqzLUPQ9Gzo- z^D=1Y*6-0zY{J_)2OmIM4>uz%mR&xI94&8KpRPItKEhcHxSMam59tCgT@V2t!&qF9 z4kYZ~*_P`M-vxe)sr;CWur>G|fa86AUZ%z%FV5dqUR!`)0v|)2%r`STqd9 zJgS=Pd8T7B6H3l7nDXVb*(y8>K(g0S@^=t7&&o{@!kSA0Gy+3hkxAvsfP;{8_2#(> zdVjrAW)U#5`X-#9qGd2nk$FA@rzSzAAn3NZlJ~sYsKlV;FHU5z0|vMO7{+b!c!w+R zqtH?}j|Us_9F_4XaGKjd@9)PB9g*HXy&N@Pw<*=UD<+Dn^*1>7rMkU(C zk{#l6zN2P&34meX7=V5qbw73UhfcH`w~uv~TKUa#3^eF}ma=&{ zJSWF{o8kLvftskol%j=Dnx~{)uJRbG757h{+^zWc0MGkDuYz1XJx^+^jxO2P83h@{ zGv7D%W(s2<$suquOjpJXw`MJp9xl+*Pr`9DH8LGNGCo`rbJ%l1_g^0=_mK+sgtO? zvlcBb8izYQlh*+!MFM*W`tg|RC!CO@{`=kBJx|+_iRf}TUqSGarvO{T=;bpF;l}{`$2$lTl__-5=-APoEle`dzmjO5nW_r5(~eA6NDq#|Z?--|^?09Z&?04J2T0mCdF#h#UydFX<V&(<6#zjur zbA(%ofDzQ!6=N|3tEar_eK|awiG!8kt*V&d+|Ta3dp@BM;(4ee(V}s^z+k-O+sz#YUN_fkHbopm zLt&lDzOC<}z8!%$k@7`>m+816BKSFACsg2LDS;<+Q}VIw#w*~I1^;fX=U>h35z?Lj{LZHC2(>!9_e*thqR ztZMwTyZof1&zUw|4N6rQ7``z&cR1#tPR)a6;si3dJet{Ht#hkB&Sod*v|><(jv|p7 z1|^vnVa!8vxW`KET~D^6anKbEpz{$({460hL-u=y4xbxS>D%(Hr7GxOi(;!@*MSU7 zAkXNlN}L@G$yhc9yP66OaRXb%!;?>_=YCqd{F+J4qP&q;9bhRn|LtAo^l-t>-lj#8 z9#TJn;_O$7%|S5q%&cEKVZH^XrO2p%!$WOam?aF;$?CF?w>fCGX;g>|(BMNeRg$t~C)WoZz3@^24xu}WzDuf}U_n&g6pwwW_ z86uH(ED~6Tun(cWH7a`xy|JNhJ2y`@)O-hC1{I`u82!9kJ(8?7&rRLc=8bpGR15HS zdd1*%lVuNC{kgVx(>$7z2b;pH`%kf=`W2?DSXh!n$3Js=3duiUALN+!gO?_Bb_$<{ z3m9xYX6rX)>$Ab>@uwYaa(ue(Jh!BELX^L|nFv#69HW z!4sCm*b1rMcju1oVYAyJ{*KFPE${XM-36-q5JW9;3FW6vTS_!nlgW$I z7Ngg*c|?;W9?P3}`l!5AKI8W2WHak9b-6dgGf3Zg5JrWyb%BfyFN|Sx%)IywaC(PayZ5<>C%!nI zeYxig5Dg$ni1w*GoMR?FXs_*D5EsyuM>ju@zkkE-VR?~hMKdaGIcSbKbh_9qo_kW_ zX5EDdks3Ino3(d*M^=t7fd+9|G^v8o<7e(!Hut{z*C-Xm*KkXA(w@CC66Dll zLDI;MxZ;ABsbjsdUVr@TOx(|S{TsDYF63ueIbS3 zLQ||Zp^`YvzU8!-L2^nld#$EQu7X-)4ZgIjfidr$H>}tGJM6{wx6*glb&h~<0ajP( zX8+5ts$RJ?r%LO&w-S?$vgBmQLe1kuR$2SYg~OgHo+O2sRcfJn z&T6O3Uwsz1lksI6JgCr9#4stOm0b7|tsSB&@~5StaThIedP5%RFhWUj7RNFpBV(6J zcW=7>^imk~%yn?8zTGyR{%#GC@r&sk%naZ>_b=n4P@s;?amEVK=KZ?VS9_qWSev%3 zo0TX!_g0|yodWZ?v)rFUSqY4jv#Fle?F*bm0fBC@kHx-vo9GvEul(5ve-w}9)pyT7 zSC?W|Jds)Iv`g5We{6x|O$-j-gwVp#*?he)q(o#;J%8kVQ&%pRLr_Wd;S2TTrZw;S z)2CgOPf0x}*~lBvEW&gZKMfOn#Wd;URn)#7C+X3+{{Vl@cFx^A(&~6|84ogeUbJ*T z?vARp?n?=u`Mc~9{peh=eU*aCF==%7@a3=h$d_?myBGJfX5x617+rv3O&{Ql-QVcB z6Q>$cA4%)35S{vILLu9gbZ;*^!&4R|^mr<7S(3W_S;~CRhcP+b_5>iqP^A*H6aDs~ zx9_$FQ*6PyOPlxy-OJh(@sDaKVAS3N%0$H8%- zB3fR-vlRx09XeYx+ta&V8hS=u<)OP8uc053PZ#vY;HBePx%H)w)PU4Q&-VmJ3$o%l z^%;oYd^e7Bq3(6nm)1%oYPrUkek7|^2Q8he`UzPF(+flvtq34k8Af%djN6td-#Zb3 zw!V#Wtx^tWro^mllofH4KRL4LDD2?bZ*Y)f3ZN9ZJEv?G3`+$tob4RS-jG8V>^))1 z_~Pn(zzmj%_oQCU+N~_I2)q;HE(h`CJ=Ku){6qVm%ClpwVFc#!a{I@86G;f+`!x1K$ph;~j-6sTXOb z*lNb1Zi^_XWA1EvqLYxx3w_!~+Oq8X1NuYt8a5o8M~}%@^vt#Mc7x9U6w#%+2(5sV zL}X8p);PwlA6*jtJf&4pBD45&sZUOR=%#f#{Tq3qQI>)gnHI^t>1T|4C}n0!m>wGp z9#7^b<_+&n=deb4B*5rfgmsD3ci@*UA{7H4#7*1VhThVqGv99P;6v%bb0C%m4P0wv zum019rbwcT>vHP7zaqN;^x|MguCxj;oG)%)fV3YFI_j+v0yhZF-%ng53GoS_|ARjT z0ZAQPPp}_>^Qi}?d)!%HR0s<;*4tM9V#pu#?jJA6QlmG@TF*7kdm&R+$qqW3KD*jY z<+R6Q-MYrunv_v%I~91e_Ap7W?=m^gXPfYv#^E1IMq6E-hZ%`Z-|TO zHbT!2>RQjp#CFMWyJF|kks9@21@b8y-V==yYHLm*lTv9CHdjlIcK3fLQ{;?n+^YN$ z37y%vjBMwAa4g{9YUqHph-K4Y+7=`k*C*ImQ3A>tZj+Z6l1yO_E2UTK6eq#0C*@f0U#yNv_)udC; zo|w3djjKGYt5X#IdJAO*WEcMqzHM`0*unG7!GnrE5D={cBFx3y3ZPfNWh_ylQ*2tW zr|7|x*n7%R?fKs*Z72yrptBEvvHsHC!^E6hQylWm57h0-Y0nv&#qP$XxBA@ns5hHm zrap4Oak(F`j*=c-Rv3>P5mwpSL`DjvE$P=Wq0vb~iGB7Ra#v24c3h~si`Wo#hm0*K zxgxWl5{wHvBA;9PY3T13XYii+-U4nqyp*?k4UxLdzWR!@FeMtI9z?XC#1RpuVNI>b z(fRY&w*Tr;qLf{3O(U8%`{#!9;!JL8vxET0@wt)cI84E-%4B|@npUvj4dh+R6g`lQ z;{;ImRIclfjRQH96e=roxkpN+SnhDvEG&{}&Q z9b4YBjIaChkmDhlPxJN)nvJjI&{}=WU;j#z>-KWd4l}gg$gR9@ZF6QF2Qghj)O$Cu zY2T`ug1i|UisDFWk9@x&MnQ(XH}YsOvf?Q&=2X;t{Gl-cR*+AzW;$CqZBMsrid?>T zAW^@rx9nzwNuamA3;!)*G*e)Cdfan)lI-R#-ZPoxKvjj9EX9YT4xcigxOK#spnj?) z2#;RgRBYkfuR$hOmlmxYK4$qVpB?z3>y>!Wt3ji<>l2YzRxGD*5NF@YbffvmcYc!bPvW(w}3N`6?zjc9nsruX4#% z9PBT~oO(>7v!%ddxk?nP5cn|zb_GeRx}3CRMlrS+#pyO%IajRN&$!3yb<^U7uQJu= zV7fa*<|9cyY$r*I6BQzNu68HOcF2?nPpxXT3^aQKN? z2wG$wAIY@?pJfiRf#n;VeT(T9WbMT=SH|3x&MG#rw4ODKjA;976@XB0a4*G2`o|== zbvHI#!49mdao4V`)P1RD)FP|lqmyw<)L{ZV_X&fDyIkUYaf9O9!D_qoK7uV~f>lN7 zji&GZyx?u8svYHDTFVmOU93_Fi?Bu#47uhM)sxcNW?;*j#z6}+CK=m1lYBIZ`Duf% z0e<)R#8KSxZdab3r1`#++bW}Y{+tlP<1p|#gb#*++SrRG$TL+YYP``e9r#53@80`6 zQv{$p-T#s%N}_$dx9Iwax9$q%(dUYP*G}^ z@4%TK#~_n*e=Rbn=*82wS>_mR-ECz~j83Ava(#7D!Q91ka&t}KGgIIL#&XkXc%A0Z z>Erw-X-XlENeDD5L?#2XL2m3t>?Xh(bl@oufh&r>G^CRkM3;@m>TPm!2zf6uZTEYn zk4|d&#nQZ0TwaM&^lx$okY2xIgPqiapOw5}obi(x`>S`ynX$gOZi(dFLVpbR3H!!} z)oZcSNtH{cq=dJ=0J{P}g}yG%?UyTjnbOMqo5nOVZH|dx(hb{FI_=S0M77IsjM8KY zJ54JeAaALYow~h$SAk^|hpAX846C1n5w%cax>**(Po4 zj@eIp6Bw^6%rU$nP|^75H2P6GDDl$+_Xm~-{5XG$La_048r7?q4&LIQ(?}0ELt>s- z+^ErMM_6hm_SC(**Y@_oR~X0ah)1Rxlf4HectVqYh0*X>>h4a<6RFNWCKSV2o>y0A(8l^7`A`JMcF@+t5l`L*#S zLFId&zHbf@=)@2IY8BKO@{UhD)IAGE^DDC*G$| z-xSDCdb4y?g{xOfNyzw`$aTFYN!DT#io4{$@IkVKvXHrn)}>DTwf%GzL9+x$UU_w> zYjxFeL&c8^;N#ruR{mR(2J%nVk7MHb9l3@)6y~qU*&ERung;mi3oAZd7B6JNU2169>D84fIv~88EO&LRWwPxd zWTRjTa;10rhW#>s%$ZWRv?IAY&FBFW(I|ctr?lY$-N8WVPWesz{8nI7p7~_aNoCT7c zpnn(#e{KH*3>Sg#qQg?n(Z6Pc#;YO&D3S9|h?*ip}v6gFwfZ|MuJYQ1TAi#`%8m7>`Ghz&8@y%Gd%2 z&Gw0K^O^6449WcJ(v1-f)lCGi*qP69*yZMhA~3Ph^`70Wvk)TlpWKVB>Dw7X_&T8Z z_2ILvUt#<(3|VVa%ZV-&3|ZP9FJquwA$Zh2!~{l}$@fG4>uQ#c9noFSkMcqW`hUuI+^BFI!Oyigu%Y zVGhM|lieP1Y-TBm=n%NudyaW@JceW}V9D4zHQN4aa5Hw8AyRW>afa0`mvAlB@T~8T z-5P$@Y&{~@{}1x2H5JRl3l14LxaPb(euG`;)9dhnD&hErlEt@TdwqraL)B~d#n_0i zyUUF2!AVPifUsJLL8ha};f@+7IIw~E$zr5tUQ5yS*SU-pZD~4oRPLERGP`9fS5UD| z!jb+O<+*q4lvxx@SNSIWYWzy02_A1q+^9_sUCEnYCD**rLYZlyb6kyT#Pd{d+K(%o z(w#Kp@-kE!&Dnrzoilj#KidW`-rAf~e}Jr>b}8E1bgn3s=>NYeYd+o3mL{T3NOB;1 z5Y%U})p(b+&oaOqM^R1G#4}{iH?!Rn=P(p=g>iSPVO+%ZkNxmcay=qEEwPn<78cg! zI-bbvEg;WcYW8UN_aUd+K&V^)CMGcow+6v5=l|eS-=ihRJgpm%ZxaJfrxW116o{f? z)o-2Ltv6sbUtce0((T)t)ih!?n>jCq^nSR@z&d_DUX*H%^L2cx;bo(FlV66Nkvo9^ z;34NhD`}D;?poc=f~z`0`{MLbl_jM(zwr0042Kef$4ZF>AB zWpPHf58U?nKR!Hg!)dwre#GU$5hb82(lJ1ps)Mb9V#0ZQtfDLRSGG9jqDO)dkLABalnDXi`)y$ICHuMMzOQZTB){;^~nct;59rem1>K;BkdzGG%%b9gj z7vlt~R>?y8U$_JW6XP_tAR>z=!8=woq{Uj(mk{!V6P@RqsNvbaa^t?GFC8#wVV$ zxF4aJitxIgN7I@&1lc60bmZ4}U8epDMA*^0O?^{Q8`r#U_*CHmC0XDrfFWny7_H;9GBLkY_cNOmx}U7A~Sa+CVM8Wlh_`$JoPTLLdh83@6!E-iaqgTgN88R@y9y&{fT z;lu6KKvOyWK=(CXqU>3*&1Buh=aSzMk?D zKCcB|D~5mT5IvaI*ysG810sY9CckAmnjG#X?vcQbCwA<)qd7+njhaL5vM$P&Jf1>s zBbWO60@gg&(AxpSA_%}#z}-F%O|82L8luCm?$!(x_M^ys@SC2wfld%55~lg>6CYSl z4z1HI*+kVBu~Y5LH{a{$M{CU)_K)fDYdsVXRR_MOIg#tUxn2|5^j%11_qkTa%(rs(XO1 zPyL#CK>A;+**;B;KKj_{K#P5S+%LAvsX5%%0?e z6Mk<-ptOZ(F>-bXMP-rPtVXqo7|lDZTM}zTFK?IRy{U-JvzZl{5^^J_Jj|x?H)r&w zB8+(i2v~NuC8_6zU#FAw>KNI>b0WW~Z19WjY13Z6({hpDr-z<(zf-Rg#n;9aIU+&e z|H36f-H(Hw=Bds09C`yJhSMRCnWZn`!Mf{9kCs@ogiJSYd^R3*^0_1DCe>2nc z=D3Ss)FU?j3CW1;DEk0UJur6&+$ zW+p>Z!O+J9d0keyoJ8{$iY)zJ&FRbrFJ}GEiu?bpTyEE9OE~tr@>{doEcsWn0;+Gm zYNhx7!po3YV>J#l?ftL}@}Mit3>I$4V0AYKChcc242wV|oVl&@qp~}_r1bJtPetUE z#Fe9(*4QZJLMPS4Mp^Twqd zUTpMw((SNu-5May-d&LHvf~{nJw}U2i+hH>;_WG37^xqqF1czY%hmk3Xyrp-WuA+0G>=cdgrCR@%ljAv{javfWBBz{q8-8@E@ij6_`%cRCOfz|_vD1^>TtJe1Pk*$wu{%iPxF(Jk|rKBRWnh{e3p zf%;cyMCg%Y3^p!z2^D9x(_|S!;4NrOF){eq$=a+l*OOR^<_4-e! z^!a?fN9l}A>T$BV(GD*jK+Qz}#B+8hvAmn^8F&g6*35eeQElOFJqN#`9&u~L(%hV0 z#bBuCIVeo!7l@LaK+$;REZ*uU*VnR18=LWP5=bkVa?7EgzT_0hkvk^}I44#y`(N?@ z3#h`&W%;`5d|3Db4p0TwQ-Fn_A|$*A7x&-|FkW>B*!`egz<8bI%uB?qBV@RT_MR{r zYI248NlPe8!cTUG0=MjdBpwK4_ZUDSzt9(j;h?bbzagg`HS-Sn@m~(%7EnD3S_$Mc zQ{{^joQ+I8^YtT$C|DV%A?;6G2H?JUazyXV+N%DC%@_M~$cK_*@a#y+Nk9|k@n}uP)I-5)bsLvLb+pBYuSyi5wLDiT0I3=(aAvk zcy=i`#H#5lMq{Ik_1DwNq29#pe3^c1J1^je>l_GUY`i3^*#C%c&6226WJCm+e6`I89)_$ETnmTY;Ne^`G<&M7^Q zY^Z5&ZWOc7d~a)ebf^vLyx*-^iqJf(XCzI z=5O#A(5ox56PRni(rj%0E|lzYTF2}NB`IM>2@qgaeE7R;QJZM_vIcRc&;P-lXl_cyi*we_ud7t3=LM&c$B4M$G9b1DcApW^!>tZVq7$``Hsu_JVGWyr68cE#KVx?*19js zagb^8^SbBEOV1-G03X+EdHe~S@P`k+xFUNB4x^}jqTR8o;;jV_v*u|;UwKQN--fZ( zMQ%=)*-P}^E9!H!Z;8f^tGa`T-4nAMsRdmD_?KeK##J^KUiWog?xURRnBq z&egKnYYL*R?wzA~H!?myDCtLMD5!~rx2dgM2(0=l+THa6Vx=agvqII@BO4{Q?mmet1n79+G& zKi2;#Ri~?~C;zfMVXgvcf0|pbwcIWH*qaPvlw9y3N9Q9yFc{#hLnmTIG}aGK~NYJSq4|^4QGi=8pGpIT>YiI5yXb$JaxN z4q$9<;ViW~ne(F3z^pcOCLVJtaAzt9-h>>Kd_3T^LZ{5IJ}j86k8HGFFZ_B<$n*>V zfs28<3&*~DbuMm&NZlcL+4BlcJQSK*9&#w{HtnjsXn`{8yRIj};xpuNY+3(`DCd?i zCIW^m4jMXBF>87AoMUEj+lS-DI#Eje8ni+)2}|?Eti}{g3tuL{eDS^YN?A&+)u5*3 zzInm!qEj{z3QlRd8coZiHJ0xTvY@1a*fvZNzw+8jN=JL25ta4=Cdm2I8j4_E6W}d&A$-J z)4XB-f@D7s#)RkBmV0BGB?x~_tGwW;Z)9xco&Dn6=#>=XPT8?RyS_S#21e(_js^yO zJv-eg{NU&&giq*^n~~P&`YsLC&N%|cg{{Yj${v}KrnnuL(#$qbitnW$62PxBuX__m zH+x;`Oeh26%hF&+k7M4>a;~LpGbk<0h&S*PWXDOE3C&te#-k#~?ddPZOEcjgsC%;-(YY&jBy%>o|@U9)OGxxTVVwo8A zUF>Co-=9+&tts(*GF>h|YWr*;&ZV$LGpWvsj)&*vX??Y|x~Opm{T*AFEprsdUF3zV z1b$h6CbupS1?R=G7vBL_N*tjXphDW%ZYjB}&!dqQF{IShItIWQ) zb8QluMvp0xOFZy^P;?fP8`xk)aPo+HE~0GoQ1NyR7)a2`b-hDpEr?H?BrGc{RA@-a z(bCZ?v?KyiW!P0x;lH2MVxuQ*6H6Q`=2bIoz}1KoICxu?ld=HRRDUrjzBQ|3?Qa{j z?Ytk`SXO$udCpDi?@kvMBPEU_#4-%eNH@`K_{$Rq{dw@IEw9(29nuA(%Yh4QLvK}DT0Or9#I}dRK8+xyLmF?HkG$a>c3kvcWwDeIHxVk}HQZ=* zl|8TQh=B};F{G+}wnQI-u|ile(za(}@NL4h9CgP(sE0s7_vfe()g9x^p-0R%902!n zwglWx@Tn~2lWcbmfCE3|@jCb|H$=SLbNn9Xj#Q5lASEE6wNP}FE(B7fd*^Xp&3Epb z$M%BItWbO%Y-)PYKP{JDn&O(FB(TQArJF=W zj#2M&05p4)(#?QT?iD@GIghil{9Dl{)GiI=-CA&e3j*XWUpc6q=YT-B09N3))YOkvj|wsOUTG6+%jr#CkVHwCCz1{jdsB3FIo=;ce2Fj$ijO7)J@{z!7jbLLPG@j$%36 z0cpZZsH9j6rZ6@P-+kyJAhW0XYo7R{_hQ%rD#|MEAY5FMJ{sn+HHw`sU(Z@wluw*K z8b`d;=1lfyl63bSX6mj42Y5XM znh1S}!uS|`LTN0?dR4NrVe!AP2+WoN~*03N<_p&ydu$OX0pO#b5+xzz#tnDQBMHCSo6>jx z$evO9dglbnkDyW++xw0G1NpKz50YlXYI*A<7`ho*r#!KA{x4%GafJzky(^={u}>jE z`(ost2oM>cu!~6K9<#7?`+KQ?t=(?9#0TaulA#cq&B>JaBYCz^qslgCr-@iNxf`m0 zME<%@vHcAJn#}$oc7ri)VJs}7 z*rLCnPSH@diH!cT@^pp&T6D~q*>!K}Gry(K=9qrGAwR}f=|t6EUu-TQd!DSBFDbW{ zis@~P@Ylp5qrK?{8FAZ9ZSxP$pAFNgV8c~ z2F28vc3XY z`fWr&L85Au^k3+qcLKPDH!fGNei8EXr!)E2)SAnOD69z7dzujVpr%=4vdE_25T?@XRKmAvO4UikdYuZand zyv^?GJ))G0%AHfKr-GoKt*Y^N8U2@Pias-5r)6c!4~BKAZMemovG%MNwy$LK&p(Z% z5mHtO@QlY~)*Oa)Rjtf<`WN;W$p=E%UMj+CGeod_oV(q=ygx9zNuE$N$(J}W`Vr8s z83oI|?c;KJg;s-=6J0k(!hDRm*0xOq-F^IK_y44p7>v>!vegY0is#fBAgZX|&PaBJ zV6gpL?xji)^L|W-WV&I0*gH|=V7{;WF~+GPuu`w`y$f~djHCwJm}7+kj;5@nlst!_ zP}MIvc;r=cJ-YJ}+GQGOsgoHshxIOaP1AEfj#HmBV1X@&%yTq%u^ zAe!8yQwHioj!Rx~(bI4qh8l^9a38b#v=4XMmgeK6OhNUEx)Pmq$Y0zk3#|p-Akf@I zy&3Z@F-m!>lXLeTylL3CYpdtJ4?S@I+sdbW+BYnes!Bm#HJ1j)k1V(8R0%5W;|>#y z3Zvw3=B9tYe$P63YX_hJ(Bk<);Ncyvwix0;@|WA%j7qcJz$11}0Z>8A&%@>9a`L1q zxr*$s)kDmCPf89m43VLJ@5p+zlhc%LzQ|6|j_eC9*4@yn_z zY}QIZK^8+i^)2FiL=kfqg~@R0-7Y1Qh5^!tDlb*c1^`XTNuxZF!5rT1EGs;f~29;(YmxoG6lI zA0N^hSB_r7O6A|kS;6BCPEX--?cyCx^2~{ z?Gofgw_B15oC;+kZCPwvkk=4|G5=fTX5Q(l{3W?BrMC5(s~OFOuYK?)b;K;n3ksYM>)LwpY<&)03%DUFdD#)!>2;}*3< zi|sW&1o?B%7#Uxcdo+uMpARYKt(zC^XC6^3wxuplnlPA57=rVL5s=O+eoMQC-=Rn= zGetO-T(i8w+%VlT&Q}MPv1RBi;-0DQ{H*RfpqwGf-pe()Rmw+8ir?_`ULCXogSmgr z`vJ}0N2aq#K&^O4tX$>sVy|$AYX{}-u+Dt3lak$Z7G;Y+w&N_OJ_tI0fMB3NE?E<8 z9h*|&L)=xo<{d+5_5nU-wd{(npZ1cu#!8huX^HF3dhxesdr$ZFm~Rh`AsdP$V-08I zUo(V%P!cmoy!PwQtds8at>ev-#FHKTzF(dqgxy+;#b!9*KRyE|kq1wm>zq#JSSjv8 z<5d}6RFkiHujq zTs>!AzM&m-W~GRMZ)9j{{N|45hC-IGvO>*O>29zwTnp_K@5vd}8?v{ zXI+i!HP&k5xgFm;gOFrPPAzR9gCZvvoiAo3B$3^dubRjos~^d1_F2CmP3x40m69$@ zYK^y(#kT7OiWLka#S-Z4!UxG!_c0XF>z*C9sSBv91m&Rp;*f#d2=yU-buq}eac;hQ zpWKvi_G``gt5y1#YF94BsG50MIQl+R7!Mh?G#7qU7}Pv8Vkg7WxqMI|Bj*^$p5MA0 zPBgzMxXQWq7@*vmNWvqvWijs3EC%Q7q|9}hp(M(|+s!^SX`r4Yr`zhoS3LgBCot)ySCT@U1~#R-;K_L=Mk$4dEZ`fXFzCljBWNLtX_CK z@3P$?71P_9EeZ}D`K##1f$k__LPk16WJoVK7@t{E;cQE@)?pk8;^4$I9 zIyUHSzYK;WQu6P#$(*zh`d_f%|6lY}^+fV)u8}BP# zW!U$WIJ2d_XC?rSJ^kocUw}Ye9KYIeALtVNxA6Q~$Qvkm{*!Fk?Zp4T7yfg5p0ku) ze<;<-t32O8x5>531=KT+eo_5zoBEt(Bb@&>e~`QvxKc*BFN)?&i6R)Ur|wTv1 z3tJYm40prM=zT_om1I-2ICts+_UJjV8%&r#{=^u0QHw|_$kAvPO)>zEg1~@a@yfxh zbg2I%0~x0wHAXH(pj6WYFZadoAW?TdG@q2B+S^brNZr?puXWXLzHu2(_&b0+3`qYHjmG!hLOJ}Y~&^q?_Ovi zTy8CwuRf8rT97)YDL)XGnIayU!mCt}_^NO8CA%rT@nflh@$ zZdhIp2KJUHJ^Efz71-gRutC&GiLT(K>XPgU-C)S3*|YEcy*BsW!H&?8`llg>K%joW z_?G-=^%T-*bzNa?be!c#&2+B9B4WK=WYH(gsD1De%Vx+yB&=?XNU%Hq^5M<0vhm=v z7s1w~{1~k}E)|qURHil}FOsEH-yNIzcOqCF7(6Vyu_UPP{OtS*cD`TX)+mS90}AVd zK$!sO--*S+&p>!5>*$&p9lav^V*^6_XyCq-F>vVrd3UQ{!{~S zGb>LgVJUa_aa-z;X_H}_R#DY&OhCv|ULe5;j1L7y4&`-Zie0g%_wDScN`wPa4dnu;5XY+C|W1wS!l=-{Vk z;_lcnBHqRCJG@Syi$BSuldqQk=au15eT|J8g%$2G*(IX>0%}Bv+>!}RbpJk{?8~(K zzWwPcKpvYAh-j}o|@Y(aUg0H)EZUW$wbS zJ31Soqfp%EgWl?cpHI%1NS0p>&`(^I0fLy)Xq~ymfIZlk(Hrh{8VUPa?FM;3wL-vrHY718d2KG{1TNos(lr1W=875fVQlN-H^y0>;8v+f}>UnQ_;J zuG<+e+@?X$@P^yp-T$Le=jM@v3+8O6?!=_u!r$QcC%6dT6*dOj*848qzb>8ohP`>L zH_i*IDD66Iwwgh95#{Cl`AITW(Ax8?(s(CeuA|Jzp0)`iqL`WwhqX!QPpIhKXd5#4 z_*?hW0yT|yyULCU34{LlTtPNM^V=WsHNjt=_r+Hk_@n7nTl{~whugnJIlcGpn4xaz z#>Bq6j9mTCFy(4{IMhN@CRM~d{K0wTRPDKR2lK&jFdq=XKk zNC}b9TLMT6kmPODbMCq4p8MYWK}p!zd)Ab1zL_U~LM~xVOFvrvdV1?+oba92%o7^7U)Jf^i+p{SUMrtt zaNV%*+x+3jz=vgx2g@UkMtJmLCUGlZMc)lSQf#z`b03Bgrvj?8_ppr3mjP)hKlxjuF;&Jpm5AAF0G?m$|8s>@s?iz-foY#TisnxrI5Qu6CDLUO+oR=wG*<$2DP=a z;-a8<5v>G*;5#AQ+`xxlNV$%gxhQyVY}8Nh;6Cg%EW*hXWyHF1tJ5|3$*qxCvQU4( zs?W=YBvn)iHI$0`3%=>FdB0640Plw(&nl1-_nOH+V%W;wj3tDsj=F;m2EydatE)Z9 zL^9S|X!6NJKtQeGJ7a4}l2**gAKsb28ek;tD8%UNt)V(d;meuIAc#@WeprwP!q|d* z0B?7F0~RZnuNa8u#`~0h+}YXb58QQcJ}CCn<^W_z#)EmnJH>Xdgz&7V9a+wO=PJJ- zT?@!`{pe^TOu>Jzo*qB(93_MC*|Q+;SZH>;5J$-u58?pXOhCS4_0vQYoHWdbDA1BP zzFQ%Nd4-<}-Q*IfA+Mptk)mmXaKQU-SV8&d(DtM4)n@hnYu|&t%Eq~q7-n3>moU3Agj4aX*f01LzIPi z2RsL932*i5mgN-P-<2G;dRq|}`OJFZCUz=Z$u9urVu*NUm81&*=hGa zSkAvLYZ^o>{c@i{#k=+s)Yf`FDavzu>6B{@U_s~=32|f>q~3EqaP6}woVd1_(0pe2 zQpg7_7@&;sb2YDhX(87>ux)l3HErdY8Ii`yj=0TIhODi{#k4@TUVVGajyG1#`ljm+ zO8D}=#&$bKj|%dw6Iwt#?L6t{UHMo_u4yZ|tg9!GO!5jzk@Is-PRY+caJGfc9YT2N zo}YtUHX`$ z;(5!>Cn3_CxUsj+vnIxM3%m50-g~{fwiy%dmtmZ)D=8`FtD{Ny_o)nb-WEG6EcC%v zr_nPbI^MQxdq1r!>8Apt?F`EAH6J{%3_R6YpFM>f(`UA?Y?dMTDv;vu1guY8jM>{c zDa^q`gLdthJYK(Y7NY0%>t0A9vQB>LO2>;&rcSJ~cD&2)C-U9gZ%*HeYh0?HH%s!K z^DdyoH~jjvOB(w}h-UzQ($?A@G7|dPb%%G=JRg>{h$M5cQ-}LL!8<|7-pS1qA zUb@57u)J5>Pi)e{!2=JLC7Lz`wjR71sC8e=oo9ecUOCWm0*MF|6$V&w(LFy8d2a$r zFt)I0{?%vgq~JCu=X&9wzWK2J5Km?#sX(8^d2aT!_pNyUL&}1?SlR`dGRNno?RfdulNCj?YAZ-}CAcsB@+JkRYj)Ml7a1 ze|2G!=qk?UUN1?r+pnk= zN82>;Wim*6N>Yr*jyYUkt+uNwgGFdlPc>l9*pkqh{vqaCyV#m>o{Qk~5a*GqrrevE z!@K6M(+e8C?JD%Tsgpvz$10Y7e5UW3YcjtSCfIybG~o2DB5pvEXXGYTI308eh}S4V zbrRu62Ri}4miIzcf%~l-xJfUECDvQ)`6{v%gGgJq_oCEDy8&C#BG!3ROdmdD;#aNv zjr5MQ;aDpjO%OAy32Ln(+rLXxv`fk^HB&dE2jn2V;Aw@>5z%$qa^O=v%#fKd0)0)Y zUoEX^K17F^9}KPM0XA4^2<+!4^#+suyl>9sioH&?QQ}@~(t8NHC(E+%kgYf`$=gu< za+7OW^Q8NGX}2i_^p8&tsFFJIE=b|CAu-4!LGf+!*dxtf=ErN@PZ{nB4;}!bYow~` z4%B<45FdzT$j5T>bV7X9)NjdxQwx3Q-ji;x zrF_8J;}9t-{=<~dM?y{1Ms8u?TV|ZjqUqVa=s^}OPw{9sT9V51yViZ4M z^K{%X=56H|%cDCY`H(vS)IGOr)&y~xL0hYfTwzgqn1MU5_ssnjt736-YaUBA4#W&D zdD7GIfac|gxQu++e%^ZV*fmnrWUEi&kR@)rieU&R;rJue#E{sBoU-eFajikEaHCg0 zXqH0!0lwyS3yjZy7ITycXeK!!h_q@%ijO{rdx`u5}iM9SdGUZ}Col2^M3N>b&qn9I$oa$aYTj-RVvm9d@w)NNwpVeeWlpK^$@;|~k zrNHj?r^Uo6xc!*Q{QSw(aeCch@%60(vGr?&fQ$-Milrz1w*Sp;8qKZfZjl$!!}t=! zzG&5T!m&?B&})0=fqN5Q7Kj9jYPn9-*re|Qn9N#(2n%sS2xbKvH zP^1`1TM%1W3%-5zlbzQlr$D`U_q_44g6-hpeJ(oWiM0NB2d0v%T{anc3`^!+^_p@C z67$k$xITA6JC9=Y#w3TOXc|||@S~~5L3>_7UUQv(5ZxK0q$_3i7yBKjc(}78lGkl^ zmyL@U2HX;ivOa)^&x;i=Up*_AL6?V+3(I~vhp4lI zI$cViG9pRE_6J*xOpSx%cQ0{hjCYh&;jK4}^0s<8v7(^Zhf%`&=I8isxzFu4)&y8u z`LDO!zq5YLC)?d~Lh|uW<6+f#7g-OAPq%%W?`($#5o47WG?)n(<3@4PqARvA$UAC% z;7Ro9s?48wOU+8EVt@8GB6p|s?>&v$jh|=epyN2_b^kTqxwBNehEujOFM?u0g1(~= zKF@jEX36%s0N>h7{?uuB3$0vCC#24S&IqiTz=* zle^m107i%eZ(^Fa*i3cq^_*_ezE_l(=G}5}L3OB?{&I3g;E1>p(oRpdpGH7BP{gR< znXGn)-g#1g(%Ze()+`1_C=LYu8GXrIf}=g8WXn( ze4W&gYw4j+-!fpSiL5_54@C#5KTgHI6-am`5*)YmHuQo=CuFk&7BoXcuJL&!=s#5* zWcE;2CvvW*T}R$HKlVw;+_06p-*aZ3mZ)1d>J90Tte S~&gzDdzy^;o)q{XJ?N* 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 F{{WkEd=&ry literal 0 HcmV?d00001 diff --git a/Documentation/Images/Fig_4.png b/Documentation/Images/Fig_4.png new file mode 100644 index 0000000000000000000000000000000000000000..d9aa655ecff43d0367958e300788d230a6373dfd GIT binary patch literal 11778 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 KWj~z$>E8ff(Qb?Y literal 0 HcmV?d00001 diff --git a/Documentation/Images/Fig_5.png b/Documentation/Images/Fig_5.png new file mode 100644 index 0000000000000000000000000000000000000000..2aa95bacb573add870b367996ef439d21178c7ca GIT binary patch literal 30972 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ĪvEGCZG4LZWG(p$czi zl*uf#lU%PHqF2%G_b`a2d)|DiM1Hf%tUS{~X6LLXxp9fY;%nrGoS7rkQZu&yz5U^8 zJ#bf-Ue`|B$`ZABl~imR^YtF@IhaZzm(nH3fc6!MqEs$Ws~@W0W<~CHHvl!kW70+M zL)K7&;)50jcIDq?Y{cSCHxlh_l2clgZ7Pa*O#V2u$Wui{r!z%&gVt=kPmCs$!tVty z928*u9xj_2)Z7WDT^^rMx@7H%o-gY3S>ApNvwbA-NIsC<)4S-PYHp(RLQ+@!2HN=N z01u@S<*msU(8qe(%ImcVB6Ksn1%gdK&zO3Q*?Dw4?(P!QBzx<@H<_ZpMdOt|L9@mA z!4kCR2g#moPY>J&k}FXG%7~zqQalH$30ZHZ#m5DmW?hLN;hHGe4S07t^=% zPfvejf|}b0Gd^1Q>C`zFUjABQv)K+}dY=jnr$s%Nx`20|V@|hOfSQ$RU5qz`j8|4Z8Z@j}ZWYOf=a*duYsFz`D1SUfUi6^v zrI1oT8vu=aXA(0T?TiXO2vt!`eDwO<;j#S!h)B;D}(c>ay>+}r=3+fRUIAL8Q^a=&O|0*^)sH>ks z3aUc6nKE1R6~bdrp==t|ZEsxK{(xv%lj7}yeNS^^{oer7NK=04#ywX+O+CK2 zMo+Vp9iGb+7#VzKys>1uDWb2Jex^9_R(NAij{lM^7RXC*7wlgY3ATmmy!K}$u@;aL zYtnFt%B{d%P53D!&R0r$>(xKll;YJU0r3@H$9kpS+t@cm-1+H-2bqrqpoMQ#{P`P@ zHyD`wg5me&qs#KZnCk6>n(ub%$)oX(vI2H7xtBaKkN-}j`O76q`}2|hTd8zSItE*h z1a>p$N;D@{Otm~X@}ffH(PkGmWbln3o6gkw=%run;sEE@<-476@y5l>T?vzXjOE6; zzu^4YNwS4^yqgW5d@XL=*@B78qKsmV9%7Bq6Cc=L?P-ul)%2b?hcK)NEJ4ji<#Dirx^=~)9d(y!!j`4Ylzbhj;-)YAf$RS`AJUEw3oDn)Z&ZcGjw9nLrrfogHpu7} z{-WsRxN%?28L)u-?Lx9p;GB6@kO>P$&2*!Ez_@@nQW$9CNhO4@9oTT?X z$QqMmCkuyrG#2@6v*yX!D{h>%O=KUjC5zv?)~#WSQ7Ow6Cb*{_W{(fb8LhI?TZzaJ8Lz6Pk%aNhOEVW0W}hwdRR)XX0_QDC z&IZLEezMv7PmqMTH%7eICge?wc?b1`I6bm*1wdV07QUy2CB_@48Hh?{)#L*Fe&~oU zmjKB-`ynkUB{M@o!(uPi44v26=%-wP?Om&F%I~aohaU9L~UDSdbV?c=HiqRl$iW;!S+>a zcb`a{0p~)}xbexNb&0`@?8_;YIsDY!p%DXPvpRJSm~k(GVI0}Xf~F+w*n{g;D?Jl+GG56)uElUOkBPJ|$xzr5>U&d}TwT zOlA;q^$Tc8+@`buNjz8}J_x7O$nQF9n{~;rGp%((IT;ZrXOry?>Z!#iSr13cwv;SI zm1(vt(vs>&*7nj+w50Gqexs*{!GJ@KqU43G%X3kAMESX&)*#klTA2$6r-~BRP;cZj60ma7=Vep=U+L zJ#5ARv*X@FHY5x}cu&5g-P%MKiuR~qpWm%FO7Rp1=_(@_S z^QT9X)H$uLTEz9G0-J^~SdM%GmA@?V4O41~m6ug%s!YUU%Emy^mK&hdae0tjR;^cG zg|HA{?X5<-(#NH%+^;!!y*ypW%S)r4P)#{_`wnlMN=RPzy9o5VT+eCAdmNIVjB|JT zBmTU+c2*E^V+|kJQ^}r^T3*Myd^#&*C%XmO`%aMxPJOyTyc2YI6m8fJwEQLd;LCc_ zFuhY5{AyJ%#AmTehDalE;Vx-mgh`N3FsZ(o?$PNr$7wpAHxVxdp8alVMU=|yDJQeJ z&v62&mR@W11;-0O{VhYILmRK_*c}fJR(9m?-t@*? zI~KV`#vLxcjG|I4_35l}Or51Pjb{jRuv_^zSO?G@cCELgwa$$O?QGORj@4y8M6t1S zlv)SPuYJxOGyW2&Qx%LP|DElze6&klrPE&9Vv~KUb@qkg@&^4kjjm%d_P%_h7Ln+Wa7J?pCO?8BwehIXdLYmz5YyU=)+icOgSv zi}fvuT4S`~#XvMvvW81^cu230ndgV11o>_wH^2+2Wi)uo8v{8-$B^Q}eo7(4)Sr`i8NRZf}270mrrDfLt+ zrh)hRFpT&_E5sCpaR!fe>N51L1n>3ED%SV9%HQOUJ_I4rfqhyjn};Ff6cNGI8IdP$ z+jOl2mpa5}UMIXTrzDsYl?ht&lrIWCsQ7BDw19kd=jDvzN){V>{XKC0CWK~wnq%G; z_h05i9Xc~9RW3TYE*f@1Xqy=9^R4m2ATvF|k5eWAbAtNqIpvGLnTMcJ^XKZMjzvk( zL%;1tUA78IqZW66@sja#?6_?r5%s)zE%T0fX}+J0vo7)3QwML^&;(&uhFGwk6%S;} zd#&)`+i1aaF`e=Dhq>m-D2$)t@(ojtid=t2TQ+Nl;mMv?bF^CQkw^J7OrMI{2`-;+ zd11=PB-Ut)o;JnXYs!-=`MuwK4DOr5y7fl8)CAohHlDI)6^lvk%t&v{kfrOxV7!>* zHw{k9`EcY{upTag%_3nJBgc`)^l9IV@8x3b@7D|;kuo_*N^&QyifW_F79H&WVU9W! zi=wWCa&&mzG%1IN-g+t0Ax22rx8lz0DRsuIAcT=SW zxs?PMEmm_E2lJWw(=Wc&I}Lu#Ht+CP6n-tBdYI zgZ2TN*1@#ifx5wgvhG2=z7?L=H05Q<)kJAxO=XHgixvN4iP1}G@N#9w(?^c%%+hD) z^%47KlmPTo)Ro`=Fgu$B8>xO5|Z>^5@>mT@%WaXWI3l@I*zuLyviF)u<-RT-(3# z!1UtsKN5zG41erp_!u1dvz;hVL5$>S@r%)nYU^u?7ZX6#4i$j!haNbPjxor)L}c$;kkZH-0?9Q+3*)5+G^n zKT|~jZ^KbtQbIJiH$#9rDG5Ph(2)SmZ+`&)z!8vsq<nMl4EZGqx;b7hDY0rW!7ec|o|&Qm zPO9MHsDWcX?;Uv^Ows&Hcf#|e&rc7-vO~udfEn@c*v4K~xw)uVabIAt@izf#h$L`u zmB&UD5(@9w!^?eHt}*!DPs;n%PaltXcZOI33Oc%wl1R0Ck{~)jv-K>azWz#8R!mE` zHO1N3&$(3OFe%knQj&YDw4i@)gXdqWgrPYLyv{q3_4QGKt+}N&bU)=B9i6IcYr*mH zBH||SZ1dWCDA}0z-bRlM5|X%l)QI&60VK>3(Co%ky7%oZJZ(Og1=J9l z2Hl><<|6P3GwSRj0N>ih!rnhzAMrW8Nx>u(&Tsa6@l|)MgzI&uiU$0a8}k@U-{JqC zMDG6|8T$X1>Hir?kf$dvAD@oAyd7T0cGk$+{{9~daQ@^zoOxWfiO`5UrQO-tDFh*W zD>XAQaSn~6qTA-?<9oP0Ght(6^Y!(eQb0HsQ&z@;+SP?rsX^dRO2J}r*-J~h=;-J( zjtIIDIXTAC(gS;Yd(y*XP^@=w%P|iGSX)?VDl0>(s;ZRZzkmM@&-hCOp*nEv@9)Ez z1?j1&I>j^o{)k(;?1(_M#~pvb;laVe*jUxMcxXljF*}LzKaR)JALre>i`|Qh3%cor z>1mu#pIqR)X!Rav{xq_AI3Zg`N-94;zg!yEKit*K%#2{oY%K4mTDt7Q;$mw{%RdH3 z$?dSo$x5rXwsufZP??)?z}5)whac8jts<3*Iyw<%t^eo-YW#g&G+;d~kFe0tz2jrE z1d6I7A(h*JfLC&I!=q2Xat;yo3WI+B+}PYiMn={;LAK!&myobuZDW9wL3Y~yhv6LR z^KeZ=Lz6u(Y+$gOvX0Sll!Y?T-7Tu7mXMmd2$y7xBSGyjbpTEhaB+2Yc6N?6pGEUS zutOfUmJk;olkFK82q$7Az5Xi=rvy-ExPTEW!IRG!kIts5eX4+zS4@T{)Q7qj1rhqh3#F|I{e{2==|cM=EJL7 zGR5Vy^K&@y<&7({`Z^>TZhj}L?JsbedJ?0aG0~gT{H$xgjcydx3`vW!^CxNp1xQhf z(#zEJ^wq@$IaZj9p~;v9yK3a~^E2EU3l%cOdj@GOIDZgK!pSzKrl!lw%UxYv#j3Q2 zUw<$K$x^~CO-EBxx5eENZog##W*Cy&l84vV*QBJRv9YmbS+R{vIHAyCq?nYAV z{xFaq7GX{0KRn!r%*>|kAnTmJ7D$`0e%RI2nM2i(0p;9Svd;_DHNDiVnE2LT1P6Lb zs&5W06-iX+B^9qaIr0AU>*>=fy+($^NB z;tuz!oK>D$eF8TRFLq#iajBwQl|SppE0sL>q#%~gK!SIv`5fq# zxzCg(6(LBNb}rH75~&wVgwAOUmsoW7LXb>gP9f#eEPH*~P0fInZ#{$d4P>QvdX|nfj zDP^TZvp3&e!%k6r2)J7}sD0Vw6O6L(3#qC--${`z0D2WtJ`hu4?QwV*Be%bue(&3hSrH>9}~ z%P0K^cBHp|Lr5^V&l%32#8{lXP^fl26y>@q1IVIWgW>;Hsyi>JylJR$Ly<1G_LVl1 z1_8|qs!z2)GZeSIT$o8__FTuoh6c^0gfpUw&iRWd7??D0-{J-nV3R$}4UHZyU9EvmbP`FS3m$#6pL@CYGc|P$hIQ&nD7EDOk`XmtSYBcWrzV@O zm5;<0|Lv7nxu(pBorSPY*yWq5x^j_1c@6v~bU|GM{oG{vHV(nAF*R}N`$h#bf=XI$ zllzYIwgRK5n@c#ZwViP_nXSLSSeG{?NXiTk$VWQV)JGI~@$m6z$~kjXU;G*v8Ez$Z z-jq_|@KnLm7FO9u_tNXingS5NwWENlKVOGA8*+ZJTo#TGa` z`*g&x99o?0W|x=$iT{|+M3OT*znHAEcZ`&~_?hC+S{l`PQZ0F1TwR~b$!XF81tZgq z6R(G`#B%-(C4bRLI-zxQ5^knD8=pY3jlHF7tCbk{pB;&so9^LSuEo^iz;dBp^v|_Dbk|CCdk#! zJgQkmVh^2aFFV4fND=;zzg#xwb2 zXk=!b*SxPKXKHEnd1N4bfqyQ2z4Va4fS>i(0>Ngzl%GjdO?7x_Lv&EAjI!2llNm3e zp^g-&MPR1)jl?L)ZxMUmZ`zr5IY&1|)mOw6{p8ejCN{Xk5}zA*3Ny%|1fEJuwsJn; zaAftuudCi{91|(9f~_wGOIJ=d#>Q55M(d`-3_A8Fot(WJ5067rhHlQbw%c7U0p-Px zpvk>Sz7^iaxdP!{A$O3IG0YV1fcm@V`=&cPsH%aXj-PFSUhuI{jtkEQsZR3w`~FV1 z$xA&@xi}ys5p8br#H))MVWJ-zmV@WF)VlHC5&Vf0IAY-6I5a4e7gjuqOv-aF;_2o; z+LL&)aI$+&{p;yRHCohS*6U*C3$m%&ou6z9mvD2qM$+F$XCj2?)jHsh-tXeZtWov# zA5n&wlWMS>!NJMX>w*R={R&V@ zaUvfr71Q}UgZcs-^j2bI7OmgJz8S>895cfmqC~~5Sca#z@~|)w$)UwJ--Udw?<7r4WcE@%VoNcf#G&t5ANvQL&MEcK50-D3 zsjMu13b~T^WPQFD+A&|WDB-8___-w~IU4M%)P2EbGVLbf!j5h$5U4V!-DkG53NHiO z5p%YTkFE>zuWtf3HiCE3&GmQ$!wW8Rs%J0MdQ-|GVCw?SVla~wgXpTcKKR026EGkz zJdMN~@`QWwro++=$5!S{T*DKr#p{{n>b`O9htZ7Km@yeY-pdHFtDt#2*Lgc$ZE?=y zt@w$I@%4W>zAllfvXNQT4Aocib-_$H-%WLuI^^}iyRi+O4;~VsMXm3;bO97O5?H*=c#Hnu_SZWJwsu0>@7PQ_$H>jU zmpnKXMQ0{Rx1w9x23P@ydHGr91-S)MO*&luNGkB+Jt#UU)jDLM+fvG!xUZE>S|&E_}#j1$ec4Sb#*W0U*tzwL>OdX24+qS-xd)x#h>iagLD@=T#4|+!?cL zzdelb%a<<%`01Z5t|=<1BZeOJ1ZUveEJ_ipTsv|k17ix;s?i=SF*ats)8hYM;2w3cE|Q+ zWl&0iijjiUl6^45I@o}zNI}6>uu*UBET{d&GAbS7?CJB;F^NV_cX&u4XVSG?{Ff2* zygw|k91YgX$KhZj?DHa~BCsUv!>j+$=B;I*zOtk)B31pSt%s$W+j@)clV= z1jux_1_POG|B8ynP+P5?;K^>iJm}C7pMSF!~Y;ozlHrug^ ze@3XArlOd4c2T#7^%1m)c{sE2I3#Pba&#V*@%L}AC^E-M>U7*|^z0pVeaE-Ux#S9L zDXUjDS~ z_lXkZMbsAA$BRXYLVdvqCk{5JECD^OZmr)WHbbs6s)@0&iELNRD$_gS_?7gL4`i1l(s{0L5}onR!_gre9Lz-TK& zdxdvcGcG9ex)QxLperb z6a>g)Z~Ogh=G$^$_9Ln!;4MXEdnxV2w4%1Q(kf*KT?ZR$r7Os&sgSX+PZfpe2LvJ` zE@y4ZJIr}O_9Rot|_QTH93h)oD;Xz53IDr&aLP z?GpP1N~DJPw_$m<6-3+2%;YbbzaJm%*?o|78ML}#Itg5V%VMTGMH3pdor=Je$$av% z@}q1Z4;7C%>>@^Wna={}ow$uUkRgaZ4bPhkPI8k;X%3c@C#!ts66^ePN<~LjD~o&$)&>RH_K)iasPb*c z^{CD@k%g>u7*{I2CVSADBApsq`)k+jZ2jQ-okK?GUS}C)Cow1m=*GUpIG>KzAOoU; zBg(>XbQv#({sx|+_{p59);raknVFfy4m=|hlkeGz8Q=Wcl=DL2#2I+G z6#RS)csrAgkQogx3_JKx+LZ%;4u>orAHCh&+~7E5W^_b^jGf)_L8jcMA~c8A?{v*S zC1v4nAo9&?gKjv;qNb(>M{L^v^+>L@6$CE{gTocTH~;#C`oBhIG-&gFy1$x^x}OF- zoNvpJkYq;SF+o1Oz4dl?clY-3(RdLN43WmwlZWG?aKHv$rj$NjP7Wg-5f$iM8<($Z2=Qq;pg z0h(>+X`v&-!)h8Dfk3W)Txqx#Z~@I9;T3UjW9T(rgSYkn4_wyQ0F~^&IjnWe*X(w8 zS4c}r+NOqvho7CE!dBZeT{8{?4*?M${#SEf8CTWwy-SE7AtK#KNVjweN=r-UfkP-M z-Kn4)LO{9{q>sP>>6G*ch%|?k?(V+B_xrp5`{KU1FK&G9J78~SX3t)G&8)Sa=b6n# zWP*O_dnF~MQg-z1=-S#2P#yr%8*f!U+}_f_3_Iub#igge@hp~b=aEb1%@t5Iy}e{L zsX``XIc!3cx%*t3=7WE<(u6c5OC28lZ2=@l4Q(6l*Q!=1#?lJ%@!iAAjbm>S^>QLC zmUt-kqelYA^i+$NH4 z@?H4f2m5)d$p);A_iKUP#qq!kPDw^_QRc~Mw+0U>kyyVFS+5TrAm3&^dao?ZkrUOE z{I2NxOQ?bVWs@VN#?BOu9DJ9QX!KqXE>HYs(NIBCfLy5DcB$BsBeDAu!$+sJ4QhnC zH?0c{N=PGW;b5u2Y|F&*O>AR}C}Xne?;i&Z-j<`XF-Hv~;}<1m<)Pe)KZ&+#l#c1O zJ`6~+uMM8(Css*qyd6WYQ9Aw^mwW$y?Z-cx z;9}qYfm~2Fu!Gkuf2z^>vn0bNI=@(?19!V7VK8(eP)hOxmbo4br3{A7VlnrK zp(9-ZPahv>EMUYhWdKJb&R}?#0p$h$t_})Wv>&;`xIe*RZuN-f>_$d9dD)TKR)OiI z%z)826YNR*u5kY2Qv2!_z^y(A>!}c6Vi(*{H$$op@eL52{FdH$U#U}Ebg#4Rk!|1c zNH7%j(Zp|3l$+FMn!Ud0bsRjid66lYr__*aSxX`575!Q@=sca#kmg!dye^kOcUN-f zhad-roH)5pp7-es_vY5hS}q+m)@wI~u9zLkLvaRF>|LpogY0d89mAJrt?2ipWlaO6 zM}{PeE5z@qXK$fQBzpdEUTWiZt?fv50Jf{nS!i*;fL4tpVrNQBnpPG)+N~h(PF|Q} zhRkH;@0c;`ve&yk3gXQNe_n%G5#~afi1;UoTqj9LAGmE$E9;$B#D8_F5TuHp(0t3o zVWu1FAxAj3EiOJ??WR=e_S3~|t)`X+yDRpUr+Vt|+C(p;hi9`@Z1s2ng}rDfbSz_E zJgj@gdu~W_k5cr~_L!d;RdP3U{*h;?okDyLSI%$VdF!oEx?diy&F%1pCyM%dYGPvf zWyARioExTp7=C6U_LA}p`2dlfy-cw1m*g&GR_&9QAMEMQUw(u-o}EQSZ@HPgNqtO3 zwsPuz+QvX~liw;Q->Z~Aq9aQI{c{vAi1T-! zRKNa3c=|UP>9xx9^~reon-<2;>_tQ?Z+oiv@kpE5Dt1~s+ZDg&RT2M@93Ega_!~7I za)G%dBE(M1~+5k=Uv^3AV%h?z#?tg-nV z4>|L)q1fxJm^U7t5Rj2mcs_U4h)sB48jt(^&966al;erxrCfL0W-!|>2W9O#7Uz8@ zmD;yAKfti><7Li`NqVW%FkjTk(sJXFr*FT?+Q`*t$FAiM7qve*bD2qUNGeL=F8fFn z4~N;OHAiCg$KhQN?$I_ttu5Rpv9hf`L%lD@^R6zuHTJ)7r}ES`2d_$VAXQ^XK%!c+^R+fx|rThCaj5+z* z9C4ndV$0{h8&^i2ywGuQ97xpOZuBms9V{h7_MYc|W6|1$x9RHEM>~G%=qzc}$K=`^ z>^*GyO*6NGg$#_3RvM+wPFt`S$Z*`ZB8QZA6pKFRB+)RvIp?xhJN~}ki8p_7tjd;_ zljS+qg%h;tr5KZ?yWCXhx(#2wHZABl(l((;pfW}eOcd<)J~rhO=8H`vYV=o#{~K(E zJqm46s<5L-Ukuq$8b1HRy*TL`8_uRCK64`Ym=P{yxCit9rFfj(@Kwo6ZipztZeRi1 zi#Ac#!)q>dDh`u1#+<;bb!j3M`vdMPGf~d{h$~mz^F49g`fd%wH1RKEA%M~b=*CkY zcOfH0zk-U|0!}1%<%>Ow8{V;AhgqMho0TEW1|{7#FXLdPNjxVeCOdXYCRfuuUk=E1 zy?sbE=$EGbI>tNJvMQ}Y=XIM@8!NDHTx2zQdOKP(PYU11qi7Gs%OCf6B7Oe~T24=; z+2IB`@0+L9UoYTUI#&#G^HMus_6hj~vXv#{#naG~vVUO9Y*>VDr&u}ubzf}Z!9{u( z7oLAEd>x*KVlGm#+cO!C({xFAm?YNaTZ;oe0!;bm2r3;#xwLbDl9xks~Op-td1JhJ}GQPHn>cc8r+YfEokU0zDF z|FZr=_%y0grA=EDi*lizb%f;5N@(f32CnxcpWdX~7MEP!_RfJ*?-LpGsZ- z!iVj6#QRc2H>L_Q80Yk(_kz*hE707GmweoMBIV9rW&)8O%)`Cz8;9?iMt9YsZd2;W zN%2Su;SG`Og;xKC%E7i~CIXPrLz-Y%ix!|FT=b<3og&%3k4 zV|G;YJvw=*#b58CnjmG_-^EWhJKm;-PvbNgTPMW2fA`+t$L8nAHhw8aAs5ciJqzQe zgvQ+dioKy^Zn*yZn{;J+fQ;qFG@*YGI=KI`O(Wn3G3u9(^m@o??NOinj8TF|(>Kn7 zezzY6vmCnmS{H1wc?hWmZxfU4aj_X;-64ri=Thf@Zqy_7{fsHnGZ(=jv}WSuyhEKo zr(HkN7+uUxF_exI{Ntc*O?&KPQkmza$g4j@jgqOglB5liL}zZXV@mm!G1+mm=i9+e zEGWNHo}$+|k&68kt0^pnAeARm!p^?)nA4t>X~q6kGJ~J;b;jp+a11KM{*IKb12n-V z-#TdfQ%>Qh68Lw5o4v{ijkdJSiOOrusohi(e@$BXt+J8ds>JttboP1@zUzm{;&mF4 zLR6kh{vhbD9k~3^=&{g4n(dhX%Hy)I_Pcr%B77^Ac(6?yxToLR6+Gg4?05Im3i@BE z^wdS-v0wSLM1?})qpio6+~)lmgW6a zTUvyq!oyj|G3D14P?z_cFn+6SBJ|)PzrN;y&IpU4#23z8S}R9FB3V<27B=^@$b8?o z1Pcexb^r%b$h(V#nWtaXLvrlz3i{x_`_w*jfKOVDzP{`>COJ_RXcyoi*8^udD3CfHN|SWzJ(u(FzNqP8mz@>_0x62kK}ihnZ_ zk{q$8is?Bk^7^D}ufTia^sf`#XIl?|r5+BeesKC4ZxM~MgmprGQMbpO^AI+06N>YA zrbk&vE@9i{h^?iqIO#sE;FNuqgl1xyU$bUWzZ@&|rS}Y*sy&>aV53fQv0~V^PLo-m z^pX4z?1iz)zX!S)@z%Sk@qO}c$a%CSq~sG+ltES$l*04VtMNxu`=8tQgO^I2np((U z(gegY9c3r?DH<^2O+S!JZ&fFswW{UOH((^O{<*XoDc}BC-h(;XbM<(3T<(9C64-QY*>lbQZCP@;N{~fk9uQ&=~D1S^9f$&)C8 zABr+K!|8P;-$f~!C1s6FSu7|$Tm8@8{m`yC57NhxVKsmM=EP){maiI{xyRxv-lN@? zXz%U%=Mp?pfJAQ78-t{VTSoy1HpL@A?J4H=KwdS;eHPlcY^07MzWbcPa9H(fPuZt= zB3CR;<^=o7HL>;88H)g%9Xvx>mut;@tcLvE1aE<9FR}} zZ^Fam>PvVHYYc1W(0XO_!tZ<#Ai{Mj?2d_cwg(;*?QRKn=RuzIU3LOsuZ%r@gXMUh zdYr!F<*bz0G_e~;=kyeLOQ%<>XDxJk7iEX5O;z~h>ZcuI_NI>m-JTY(1=o9|B7c^v zW?HIl$;n7bh-CSS&T6bxHnaA{Y`P!?@)>IF4QCWE*V1G>eZC1f-0*@qVrd?JbXj~f zFE@iI-sOCG|Mb)CSAWi&PW?8P^PXl}z~{5|yqkTyzY`wgftExJ# z1Qtt)`&!)u@M66@%D(<7D1jMoT~3D-2ugi#?-ja9`0c(k1Khu4Sq!v5Y zIl4x4-2B=fwGM0!*y;(a+JqwK_fRiuK8ojD&T~Nq12=x^EFM&@1Im0p^WvNJyfNM}$XMw^t|~kM{EH08c;51}GOFY2 zrd`6mj)Xm@Qe*E1H&#_)9CEK&^B^wcr4_T9C8BIX3cYZIN~^%8A#^-1sa;j=BB=0G zC+IQ+pHON!w13pwlT{T2l^fv^RvL|`C)~%X?b7r{5!RH|(XrO!Nx7skW*;Qu zv2hZM@ilC3z__Zu#)<`oD>*Zr%c8K&L|yWR?nmuj$QR&$JBJUg%!Y zH`kps6cDX2?S&YRXn9pYpY3Ta5gE;r*f;yG)k$9ZCjJfBC|BL`SM4{au0Ctk9?HrK zmkH3{pPVU_5}D#|qJZ7CH^1Dt^Up|u1JMot6{u5s;ubq(ncZ#~yJT5|v@F=Rj5xP! zn4foB>(oPZCiTG7lF6w1d4w}e{5_$F>(==pDVRr)5&WvGGi~qn4e0S(Nn+j->M zIxQEf!Rtz`d%O60c&&VV<@>mO<+x-0cu~vvm%8!N##0lUy}DCN*sdk;+ZTiAAK&<A(`VP}CMbavmxc9&QU3v5Q|l<#(P!X4{k1FDepcGO z`2GX#(^r<7>A!%7e4{4sFI)YqoK3>8g3X>|9#&!P5doHL;4fVLJgcE~5)vjAQ$P_H z^W$biFjNdIZl(8?lF*foO`ld|5QDrjSiR7gFM#9!eNQQ=1h^Ws_yABFSOG>k0^Z5f zD-#nrMh@|zX*Wl7kb?AE4ks=}{``gbeWv3Q2kp<2Ab&`!D~9ks!&4TZ90?75B)+_kSm#2$V5 zbem>ZKfP@;mR4pv@&G4xyqcIuW50VOw*FC_c~r+ zE0Pa?F<7}|2T9*sNwE^!rwl9+ZFvARj*WGy&!Lu?ySItc9Q}_U zKjGfX3n#9?2pi3ku3;5rj(D!_=H5mt;hFKDoal zAILs>G>R$(Xq;x9!Wx5?O|QbLe+eT`<@pEWWt;^x`)<-pV!V~U1cUxdj@ z=ZUJq%1`l0kMc|w*i-8_yMKQGb!Vpn8kxZP))35W-9DV{_GBLl8Gavq4&Uk9- zbS2oQ3sT#hpLzTbR|mY*vm4wFSNYw~Y%}NTQOogIdUFa$j1rejXb9K|{=Y0N)GAbf zw6ju0Att8zT@LLxZ}!S~4gaZ>WM$3#f}ok-B_!``zy||vYwHVI139PEQ6v> zW@e@+jk=Q3dk?l&+qRw_PF~(1knz_&L1vY827bakXj)g?08aGDXTz=gO4fUOd-OLR7XY6MP{s=68pGv! zzz~>n*VbMQTZQnVkX=Y|-{n;|MO_apUIJb2(!nF65zv7g=ylMa#_kRFm zS8`wBg*;u|+OnplD);$pb_>9N_^{%-#q7Y421u3<3=lfo4M)U6~=lp%*M?PWEQVZvGxH(76FJ6*49hLHBLt-CuMacXy*78bQ~|- z*Ho01wRCl-5352+|2%)Lq=Z9YV{BxkX^u7GL}vF~Oj7c4b$|%~+S?-tDlqMu&%oCnh3o z_*==ta37E|)ql)k$4GOiu#$Hs{pzf&tPE;>jg5`qTa=x4q;c;oE-tS3+@ccTA|xa% z`HVtazX4TM|vnJowKacc? zDiZ)e_)E`Mpep&{!@UihU|y`mM^wDOe*Vl5_joM@lQh=_U--5!a0yJU;j*2l$dc9N z(6nJdsR0B4hhQ*AJBBCptTSAHIw_iX|Eq!0Ac6oqW;`^sa-b^-4iG3O`p5+o`>BDF zT0lU-#KerHllt{qFFr@?j_ZqmQAxsO_6S9F4osnSpV*T>62$n zZ)LTM2!mlT5LF8d$j{D?sK*|f2$xZDln)Q^aPIf{4-RX7dd=yf{1O%XAYkR}=ajc1CCH7g zkSn$L#0vRmQ9JWMHh1VLTyx96onQhkoKvZ9 zdHLc-sv9tIUTZC9=>-vPmV=#G?Qz{k~Zj_>0Gp^lAU{hPu#B@Sxyq}|Wh!co;i{lUPJPBob#sxQV()Vgfo#@x7 zA)jrfL|IF1WoKkj&}E)2rz0XDWOQTuiWEIq2Mb}C)BWk`*;2~8-%oHFrcq&K4BCdWpxy*@X!4?uRdEaEfcxsU+js|Cc# z#sT`ibNA;WK2o&xs49kEg+c2Mn8R+zFgZ69X}+hB`uZ~NtAEffu-(9BA8cI!peHf>p8@eCZ5|%F>**!I;anRKi-HP3 z)Cvf=>grPXst=qsP#{My#RiWc0EV^!R_6?SFeYCxV1VAjss-U(EAoHqmdZ-z2EUW- zT*X*GY=cF<|E!MV!obML2o|DSF60PG986b6@BMf#-}>*LpwHiT_ZgIZ_m+Gs=*Bt2 z%|0TL0vTzimq;ht*jSp&XBb{bn*AsiS-SDM6}3>3I}msm7UX=I%}{#*|N}` z0ou!;LG`#z0G3jVCMd3mGS|I4xY^;qJGbj^e!S5jA_d5mqf9Ed&$dZ|%vtfB|JJb2 zoJ4=~S}iEt#UhFB#_9(*wvU)0xMS<~j=0#h=!CCj=cKa}7&d&2%k#b{x$6GzbyD zH^yu7;Pm7$L>#`u@jyDQut-ot#L;wDV4&@VU**fFBh&U}SYRCj$6ljj8F$uAdlg#X z1R*7XXGA6Hlpk|B6j^RbZy+tvM-xK>%$q$g0Pf?q$A&MLCf6l(iZ`Oif3t(QE?Rr^ zEW$`$sNS*fv2{GNzf0y6x-{)=pWWBv%C5Hn6HA8#`K)|7v6;JT6F|q=bO4K<&9_jH zGk|aiO!HRfUcL;@TeED_=hG+Xl_wA!YhQONn_d|zYVFG5V`6crUCfLy0~X{!4cr+W z^XPF#&^?x`$DhtGX8dk2qix4FTXA$MsPw_PGJM3F((w*h$2#|p-Pn%lH(j)&IE zOEE5p9N9YpxjF-RZ158(jUy4A0$o`$$yPl}QHolDY(7%s@YX;ch{M@Vgh3+V@}W@$ zEDtV4Zcaa`(b>!0J0{yN7hfd~Bh5zu%^)BAAk`oEScdVY99CO5I_wKgAEAQW%NlcRo-AL5_>j$(Wnj21aJu96E>PxJ-HinAPZ5yQ<3Ee-o5QZZ za2=VO;xsHV-qC&UzxU?mL-==lPpifD_$xnQvfK|^8GIt_FAVP->~)a+`QC()UK{@I zCqxA!1$K`N9!fgX5!e_p;Ev$4?^VC2%524iNC~6KZ;eNSsPiszD$Y1 zC;J+UN)=$f(4kA(iDJjKRJo)WAiv0`FqVsa(*6C6{~f16A@8vx<+BPKR)mXRuNjFB zd1v8|adXufB{KGA7W~SjwnZ#HMIHDJ`tgEse83S-gL6dPg{91AqCH10Epi>Q*2T{9 zD1*%i+|8XD{!p^~*4S4nmXvSs`M(Z6*1RDCOFmWQ3u7I z<32=BwT3eDTM=)jYr_ZcRaUj0Z$om&_y{SvZtfnNKGsVPCRnzhW$slY@QeTP5#C16 zhsWu_Mo#^{-K3-ZtKBB=3#7El4>L_Z@&LF1R=P^J-8sboy|H(&HHFo(UX&2ZPntpt zyQHrpkf(Ltqx?OC!?N_T7d=uP#bZB>CBqigI-J_-I{A?*Gjm<)QL_ zS+SjrC}ivE%Cm%z-xCz+He%uv!-7j?^Gjcyp_6gGn{Mv<2v5f$ql~<2&G^lmXh9%r z@JVQyA+*lO64S1iEqY)rDk4c0@p{?yhXWm1Z|qu$6|;SmT?nOlhYNbtNbtLtoArWZ z#j!=o5U&Kvcp<4UYeDk&L4j|V3@l^l#-Hd^V2zbK2)@w8!K-Nfsh5(=W&?RouxRm0 zeB2t+Ye>}KiqWHPN%GUY6cX8(lEAM}-G!r&fF*^JYBhidQE2 zX8(w@9C@c#?v7tp_e2FFN-`fBAYcBSxl3WO@3nI;ipGyBcrDE;;ayZTjIcaqEZ!rz zqg1Dyz6X(gfNq5lwbkw|g^8s>1nW|I*n59HXjpoe z=VwKEZP3RJkB#&xvU+aIH9#h)-Qk*Y>lPCEoc)_P+9FN)Sv8WN^p7n>;$ST0_HNssmx(%MCz`A&{+b?O#pDa6}LJZ7>^_E~_C06&mqnzFw_CUD3 z%DrE4C3P8DD#VXqBQYdEw$nE(JSm9xIzqANrkimezRt~r2^|+8Y|?H#53qknp^QC0 zqbPEHl%5mheG(%XUlhxhMAg6B*Hg^yOvV? z!Ijx590VPl6jRish#pl_+8Hqk6nYg2I#t#vow6LX`9>oHE6- zlCb=a7?&u{MRU{}d>Jx}SyBtb(Ue#wVg1m)Jj*~|E@WC}m#Z^l5kzJYQnXAF^7hKZ zx{iU8^LuB;VL4I$UJ#GXl&zni+VLb!)aSQxOy%!LdbLR!(mNWP^g;qI9$Xj;lf8N` zA4hSreXf*J^KjIcyrC>stQK-(8p)juIdV$*#KlF9CV>HF<>1*`S=QGp4aGs(#OI_} ziluh=CHkTI4fdsUoMa?bCFjR2*Hx$VA1TKq@s4u&*eIzq-D^Tog$(g$QN9XAMWC zSrMO&6VuofBfYQuW>QdCy{&gH^6@ut+Yh0L^hXBlL=6k?JeDnVOH%|VxJeoyFr*1Y zS#PaBB~eUIu4{0M&z2T0xYHM1mJ01PyvtN?#X`b0NnE1Vc72@$9Vk3Y70G7}Ni49y z@=Qq;PSR*oX)ix~>cB{?D%|dpWDv-vFw{28QeJ&Aj>l*N51z*Pq0+_|bnk@$4Kv;* z&eIC#P?9=>>k|5&z@u&K&4J^rsh~ZEE$x`N(chJ}6lBqm9V5Gr_u+qT#^VlTnt88A z{0JK2I~5IzM3!@6>g*uQ8k^M1gB;+Yfc`uRf(jJZT>0 z6KQecWFaHdf$NVrH}0)Fwt{CzzFUU`+8C%m&{J=}*84@#nsjEtLzU9Ptw$Wa6konG zkWL0Ux{f0JUjN#1U~c>*Z(QS~{E1?(E_Uv@1>wE%1DY;Y8UaVdMTo&i@ny&NQhm_- zuiOw^8t@fqt0}3coo$B{igeqd1dD=Z2V#_*%GQ}WQ#2P_5;C34okU;+{a3p9a z+kWt7MQ%=}+1LIRX`RjH4;lH+OZ9h;^8;o_%cJV<`}L~`89m`zC*<9}I*7cG7I7{^ zHY0yUKvT2%0_fhRe*SPQ6@C?j=)Vt+i5wRO2;w`bheq=|j!ZtG>@B?NS3#`w*9*T) z;VmRr?M>+|qmRvpdl66AJcf8ZbXuHqA8^m9PLI4f31Yx%xnkVtpWU{IQ;9nIQzOD7 z-TLqezYzKhEwrJ5HkAZKXARvnz$Rl%-u=kMX;*BPyjS+Kyvqw7Rcb%3uos_mz42=K zMlN?EAAZvv?faD7@L3B*H=jdurb9*}<{M|Vu9iUab6M*kanf-w!hzkh%xJ7}IXb3U zlJe%zDon5|uO?tH)N5uxj~Mj&PG}`akg1PAVuT=`iLy4GboGX0 z;%~Im5D%$RAO9>D&l62FQ9WAa)Y586<-P3YHDe3*2hqaq+p*3QTrsCQ58fy689dS}(3)xls z!r@Ia)dj2Ix_lFfW4k1Fg0@Biu5+%d#+85<)S%Cj{GEf2>3Lq%*Px5iMJxL8PzTBX zvW=cVq4*mOEcTmhLdO=HMe8c#yXW$vR{|oL0*y8wV6Q_mU&P1zEoPCQ++dO6jsr;e z?IyjnPs6%pz3*zp9&uAj>uDry`0OB#SOD&eNbrv-GFt4EK;9gmJTzdl@cVa1eUZhb zYoUX6<9*Y0Q=LzvrSwVvr?9TC1$SZ>)n3Wv0a+rBBF^eS7i^Xunyehcs%3;pNP= zc_0G&(?SP}Q(=z+Ol$RqU;nguwwD04`R@cATb&^e_0>=}g2C6Ush@S$=U5}Pug8Mg zjeh9g``1oo;((_Z@i@s|`yS**a5cRe7UX;4)%|oFBvfzv3KR$XmfOAg19cGD-CF+tI#y{{kK^(!tqk*-lma1;KD1~)n{LK6 zJ}Jp8mJP(6td%;qF`bjH?oz1n@oeJN#r{H&!BE~K8dB&uYW^Af8@iQ#bBmGL{~n2P z%>xpLv{~sA<>TCU>-qpCCJ={8fWl1=NV!h5 zwxUI}`}q2LW6*qvh=>5%6*)Qcpb%ytbi#fcpH_x3H(;!LgD6rG*M&ndhHkng$P{xN z6q~@c1@O=^|L3CE|2Y<(;zn(5I*5sh4JQX@_JVXcn3(R{fIL0@*^P*Z2>F8te=$Az zK&0y}*_@k;Sp`x9t*=~Cp`gM8gTeHfVHA{<$iBX4@C&*p--iz$mX?;lGje{zP!@jl zNY=oB0?fv3o)##-sDdMI>OJhO^=dI5@|+Wm&%w>Sh(P-IB}XEdnGq*63)Q*D$ea)) zIN=m%wA9zv8(iH(3%vKx$=W(EEUf*OtFi?W%p^|nT$bQurO3!g5vM7jypx`p8Q^z` zvFY;BtRO!h(1UR9go1-;;iPCZ7|Ech0cr#u9v;JSxOjN!>FE;apDQbKa~IZz3Q#B% zsOtblpH<7=*F0$DBQDucA`s`3K6s$1t2;6_CW4Ok7>vU%36Ndtz#~+GgN0qtOxRJR zfBYX182o7^Lwm3~*z=katyS3taeIKTDE + + /// Gets the tree factory. + + /// + + [Import] + + protected Lazy TreeFactory { get; private +set; } + + + + /// + + /// Gets the unconfigured project. + + /// + + [Import] + + protected UnconfiguredProject UnconfiguredProject { get; set; } + + … + + } + + +This extension implements the IProjectTreeModifier. Through the 'Export' +attribute, the class above implements IProjectTreeModifier contract so that +the right component in CPS system can load the class when it is needed. +Through the 'Import' attribute, the class declares what it wants from the +system so that MEF will set the two properties with 'Import' attribute +when it initializes the object. + + +There are a few important things to remember: + + +- The AppliesTo attribute declares that this component is only expected to be used in a project with certain capabilities. In CPS, it is essential to ensure that the component is only used a targeted project. More discussion on this topic will follow. +- One must only import a contract that is implemented by an MEF component. If a random type not implemented by an MEF component is imported, the MEF engine will not be able to resolve it, potentially bringing the entire project system down. The VS MEF engine does provide some help in diagnosing the problem in such situation. +- It is also important to import components in the correct 'scope,' a 'scope' being an MEF V2 concept to control the lifespan of a component. Importing a wrong scope could bring down the entire project system. A specific section is devoted to the discussion of scopes inside this document. + +### MEF inside Visual Studio + +MEF is a powerful platform that supports a lot of advanced features and +dynamic compositions. Unfortunately, it is exactly these dynamic features +that will slow down the applications using them heavily. To improve the +performance, Dev 14 carries a different composition engine which preserves +computed composition data to speed up the loading of MEF components. +Usually the new engineer maintains the preserved cache very well; however, +it could occasionally be out of sync with extensions. In this situation, +running the following commands inside command line window will reset the +cache: + + +Devenv /UpdateConfiguration + +Devenv /ClearCache + + +VS MEF provides a detailed error report when it finds errors inside MEF +compositions. It always tries to keep the rest of components working by +removing incorrect components. This process may go further and remove +more components depending on components removed earlier. Reviewing the +error report file will help to diagnose issues such as the reason why a +certain component is never being loaded into VS. The error report file +can be found at + + +[User]\AppData\Local\Microsoft\VisualStudio\[Version]\ComponentModelCache\Microsoft.VisualStudio.Default.err. + + +Because an MEF error may cause chains of errors in other components, one +should always start with investigating level 1 composition errors. + + +Some common MEF errors include: + +- Importing a contract that cannot be satisfied by any component in the system; +- Importing a single component, while there are multiple components satisfying the contract; +- Implementing a contract that is not expected to be implemented by any extension (For example, lots of CPS services like IProjectLockService are provided by the system, which should not be implemented again inside any extension); +- Importing a component in a wrong scope (For example, IProjectTreeModifier is expected to be in the unconfiguredProject scope; therefore, the implementation of the IProjectTreeModifier should never import a ConfiguredProject directly). + +In CPS, any contract that can be implemented by extensions is expected to +be implemented in multiple places; in this regard, one should always use +ImportMany to import components by using an OderPrecedenceImportCollection. + In a developer's test environment, there might be only one component +to implement the contract and in this case, importing a single component +works. But the same code may fail on a customer's machine, and therefore +should be carefully prevented in the first place. + + +VS MEF does not support certain advanced features such as dynamic composition +changes or generic type contracts, but most developers do not use them +anyway. + + +### CPS and MEF + +CPS, which uses MEF to construct project system, is like a big cooperation +system that combines MEF components implemented in both the core CPS and +all extensions together to make all different kinds of projects work. The +health of the system depends on whether every contributor follows basic +rules. One of the key designs of the CPS is the function of a project +being controlled by its capabilities. A section of this document is devoted +to discussing how a project declares its capabilities. It is through its +capabilities that a JavaScript project becomes a JavaScript project and +a device project becomes a device project. + + +Most CPS extensions or its MEF components are designed to support certain +types of projects. For both function and performance, a component written +for a certain project system (such as for a C++ project) should not be +loaded into another project system (such as a JavaScript project). To +determine the proper environment to use the component, CPS relies on the +fact that the component carries the correct 'AppliesTo' metadata. It is +important to use the correct appliesTo metadata when defining a component. + Normally, the appliesTo metadata is the new project type the component +supports; in the advanced scenario, AppliesTo metadata can be an expression +like this -- + +[AppliesTo("MyLanaguageProject & DeviceProject")] + + +Also, when a component exports additional properties or methods, the +metadata should be declared wherever the export attribute is used. + + +The "AppliesTo" metadata is not directly supported by the MEF; therefore, when +components are imported from CPS extensions, OrderPrecedenceImportCollection +should be used to filter out those components which don't match the +context. For example, a component in the unconfiguredProject that imports +IVsHierarchy looks like this: + + +[Export] + +Public class MyClass + +{ + + [ImportMany(ExportContractNames.VsTypes.IVsHierarchy)] + + private OrderPrecedenceImportCollection vsHierarchies; + + + Private IVsHierarchy VsHierarchy + + { + + get { return this.vsHierarchies.First().Value; } + + } + + + [ImportingConstructor] + + internal MyClass(UnconfiguredProject unconfiguredProject) + + { + + this.vsHierarchies = new OrderPrecedenceImportCollection 1 + platform (not a PCL that targets 1). + + +WindowsXamlPageBackgroundPropertyUnsupported + + Defined by: Windows Store (?) + + Summary: Indicates that the Page.Background property isn't supported + on this platform. + + Should we indicate any/all platforms instead of "this" platform so it + can be reasoned about in combination with MultiPlatformApplicability? + diff --git a/Documentation/Notification_for_async_project_load_completion.md b/Documentation/Notification_for_async_project_load_completion.md new file mode 100644 index 0000000..0befda6 --- /dev/null +++ b/Documentation/Notification_for_async_project_load_completion.md @@ -0,0 +1,80 @@ +Notification for async project load completion +============================================== + +CPS project types load asynchronously, which means if you query them via +COM interfaces to discover items or references, you may get back an empty +collection if your query occurs before post-load population occurs. + + +### Option 1 + +If you just want to be notified when population has completed so you can +create your own snapshot of the project's contents, this code is appropriate: + + + private class [TreeServiceImportHelper](http://index/Microsoft.LightSwitch.Design.Package/R/619dbd813d2268df.html) + + { + + [[Import](http://index/System.ComponentModel.Composition/A.html#012ea65d2b06588e)("Microsoft.VisualStudio.ProjectSystem.PhysicalProjectTreeService")] + + internal [IProjectTreeService](http://index/Microsoft.VisualStudio.ProjectSystem.V12Only/A.html#3b84de0f37919a5c) + [TreeService](http://index/Microsoft.LightSwitch.Design.Package/R/5ccb72d93b96cc41.html) + { get; set; } + + } + + + /// Returns a task that completes when the specified project + has populated its IVsHierarchy with items. + + /// A value acquired using a technique + from [Finding CPS in a VS project](Finding_CPS_in_a_VS_project.md) + + private async Task WaitForItemPopulationAsync(UnconfiguredProject + unconfiguredProject) + + { + + var helper = new TreeServiceImportHelper(); + + unconfiguredProject.SatisfyImportsOnce(helper); + + await helper.TreeService.PublishAnyNonLoadingTreeAsync(); + + } + + +Please note: do not call this method followed by .Wait() to synchronously +block the UI thread till population has occurred or it will deadlock +when the tree has not already been populated. Please review [Threading +Rules](onenote:..\VS%20Threading.one#Threading%20Rules§ion-id={F67B08B3-2B6A-4472-A492-EEE6749BF8A3}&page-id={D0EEFAB9-99C0-4B8F-AA5F-4287DD69A38F}&end&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo) and +[VS Scenarios](onenote:..\VS%20Threading.one#VS%20Scenarios§ion-id={F67B08B3-2B6A-4472-A492-EEE6749BF8A3}&page-id={2C8E6F9B-46BF-448D-B0EE-142C1DCF3C10}&end&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo) +for more on this warning and possible workarounds. + +One appropriate way to schedule work to occur after population: + + private async Task CaptureItemsSnapshotAsync(UnconfiguredProject + unconfiguredProject) + + { + + await WaitForItemPopulationAsync(unconfiguredProject); + + // now acquire snapshot + + } + + +### Option 2 + +If you're really interested in subscribing to project data (you want the +data as it is now, and you want to receive updates as it changes), then +you should definitely consider the IProjectSubscriptionService. This will +give you the initial snapshot of items as soon as they're available and +whenever the data you subscribed to changes, you'll also be notified with +snapshots for both before and after, as well as a semantic diff describing +what changed. + +See [Subscribe to project data](Subscribe_to_project_data.md) + diff --git a/Documentation/Obtaining_the_IProjectLockService.md b/Documentation/Obtaining_the_IProjectLockService.md new file mode 100644 index 0000000..5ee4d90 --- /dev/null +++ b/Documentation/Obtaining_the_IProjectLockService.md @@ -0,0 +1,38 @@ +Obtaining the IProjectLockService +================================= + +Please observe CPS [project locking +rules](onenote:Documentation.one#The%20Project%20Lock§ion-id={768BD288-CDB5-4DCE-83D2-FC3994703CEA}&page-id={4FF0E6A5-AF0A-4490-8354-2AE8AB74EA96}&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo/CPS) +by not retaining any references to MSBuild objects beyond the scope of the +lock and only using these objects while not on the UI thread. Violating +this exposes your code and other project-related code to the risk of +multithread-related IDE crashes, even if you're just reading the project. + +### From MEF via import + +Note that importing any CPS related service moves your MEF part from the +VS default MEF catalog into a CPS catalog "sub-scope". Import properties +are only 'satisfied' when MEF activated your type (not simply by "new"ing +up an instance of your object). + +[Import] + +IProjectLockService ProjectLockService { get; set; } + + +### From MEF via an imperative GetService query + +ProjectService projectService; // [obtained as described +here](onenote:Documentation.one#Obtaining%20the%20ProjectService§ion-id={768BD288-CDB5-4DCE-83D2-FC3994703CEA}&page-id={213C67CF-0707-470E-903D-1451517B2F73}&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo/CPS) + +IProjectLockService projectLockService = projectService.Services.ProjectLockService; + + +### From a loaded project + +IVsBrowseObjectContext context; // [previously +acquired](onenote:Design.one#Finding%20CPS%20in%20a%20VS%20project§ion-id={89E1E997-B6E7-4F3E-A523-20563FE2C7D4}&page-id={8250FCD4-5FA4-42A7-9BEE-D0B8E6378092}&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo/CPS) + +IProjectLockService projectLockService = +context.UnconfiguredProject.ProjectService.Services.ProjectLockService; + diff --git a/Documentation/Obtaining_the_IThreadHandling_service.md b/Documentation/Obtaining_the_IThreadHandling_service.md new file mode 100644 index 0000000..178631e --- /dev/null +++ b/Documentation/Obtaining_the_IThreadHandling_service.md @@ -0,0 +1,30 @@ +Obtaining the IThreadHandling service +===================================== + +### From MEF via import + +Note that importing any CPS related service moves your MEF part from the +VS default MEF catalog into a CPS catalog "sub-scope". Import properties +are only 'satisfied' when MEF activated your type (not simply by "new"ing +up an instance of your object). + +[Import] + +IThreadHandling ThreadHandling { get; set; } + + +### From MEF via an imperative GetService query + +ProjectService projectService; // [obtained as described +here](onenote:Documentation.one#Obtaining%20the%20ProjectService§ion-id={768BD288-CDB5-4DCE-83D2-FC3994703CEA}&page-id={213C67CF-0707-470E-903D-1451517B2F73}&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo/CPS) + +IThreadHandling threadHandling = projectService.Services.ThreadingPolicy; + + +### From a loaded project + +IVsBrowseObjectContext context; // [previously +acquired](onenote:Design.one#Finding%20CPS%20in%20a%20VS%20project§ion-id={89E1E997-B6E7-4F3E-A523-20563FE2C7D4}&page-id={8250FCD4-5FA4-42A7-9BEE-D0B8E6378092}&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo/CPS) + +IThreadHandling threadHandling = context.UnconfiguredProject.ProjectService.Services.ThreadingPolicy; + diff --git a/Documentation/Obtaining_the_MSBuild.Project_from_CPS.md b/Documentation/Obtaining_the_MSBuild.Project_from_CPS.md new file mode 100644 index 0000000..8c4cd83 --- /dev/null +++ b/Documentation/Obtaining_the_MSBuild.Project_from_CPS.md @@ -0,0 +1,33 @@ +Obtaining the MSBuild.Project from CPS +====================================== + +- Acquire the [IProjectLockService](Obtaining_the_IProjectLockService.md) +- [Obtain a ConfiguredProject](Finding_CPS_in_a_VS_project.md) for which you want to get the MSBuild Project object. +- Acquire a read, upgradeable read or write lock, as appropriate, and use the MSBuild Project object exclusively within the lock: +using (var access = await projectLockService.WriteLockAsync()) { + + MSBuild.Project project = await access.GetProjectAsync(configuredProject); + + // party on it, respecting the type of lock you've acquired. + + // If you're going to change the project in any way, + + // check it out from SCC first: + + await access.CheckoutAsync(configuredProject.UnconfiguredProject.FullPath); + +} + + +Note that it's important that you use await. Do not use .Result or +.Wait() on these async methods or your code will malfunction and/or hang. +If you must do this within a synchronous method, see [threading rule +#2](onenote:..\VS%20Threading.one#Threading%20Rules§ion-id={46FEAAD0-0131-45EE-8C52-C9893F1FD331}&page-id={D0EEFAB9-99C0-4B8F-AA5F-4287DD69A38F}&object-id={A500C3BF-DDDE-4AC2-BEFD-8CF6BD4F2B31}&29&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo). + + +Please observe CPS [project locking rules](The_Project_Lock.md) by not +retaining any references to MSBuild objects beyond the scope of the lock and +only using these objects while not on the UI thread. Violating this exposes +your code and other project-related code to the risk of multithread-related +IDE crashes, even if you're just reading the project. + diff --git a/Documentation/Obtaining_the_ProjectService.md b/Documentation/Obtaining_the_ProjectService.md new file mode 100644 index 0000000..199abbf --- /dev/null +++ b/Documentation/Obtaining_the_ProjectService.md @@ -0,0 +1,26 @@ +Obtaining the ProjectService +============================ + +### From MEF via import + +Note that importing any CPS related service moves your MEF part from the +VS default MEF catalog into a CPS catalog "sub-scope". Import properties +are only 'satisfied' when MEF activated your type (not simply by "new"ing +up an instance of your object). + +[Import] + +ProjectService ProjectService { get; set; } + + +### From MEF via an imperative GetService query + +IServiceProvider site; // the VS global service provider + +var componentModel = site.GetService(typeof(SComponentModel)) as +IComponentModel; + +var projectServiceAccessor = componentModel.GetService(); + +ProjectService projectService = projectServiceAccessor.GetProjectService(); + diff --git a/Documentation/Overview.md b/Documentation/Overview.md new file mode 100644 index 0000000..6750c4c --- /dev/null +++ b/Documentation/Overview.md @@ -0,0 +1,10 @@ +Overview +======== + + +![](Images/Fig.png) + +- Read [CPS Core vs. CPS VS](CPS_Core_vs._CPS_VS.md) for more details +- Please familiarize with MEF at [MEF](MEF.md) +- In general please go over all sub sections of Overview if you are new to CPS. That will ensure you have picked up the concepts to efficiently develop a new project type or customize an existing one + diff --git a/Documentation/Project_Capabilities.md b/Documentation/Project_Capabilities.md new file mode 100644 index 0000000..8af11e5 --- /dev/null +++ b/Documentation/Project_Capabilities.md @@ -0,0 +1,95 @@ +Project Capabilities +==================== + +Project capabilities are the recommended way to determine the type, platform, +and features of a project. Simply checking the language or the project +file extension does not help if you want to check for WPF vs. WinForms +vs. Windows 8 XAML, for example. There are a great many different aspects +to a project that may be present regardless of language. Do you want code +that runs against any Windows 8 targeting project regardless of language? +Do you want to target just Javascript Win8 projects but not LightSwitch +JS projects? Project capability checks are the answer. + + +The presence of some capability can be detected on a given project with +code such as: + + + using Microsoft.VisualStudio.Shell; // imports the extension method + + + IVsHierarchy hierarchy; + + bool match = hierarchy.[IsCapabilityMatch](http://msdn.microsoft.com/en-us/library/vstudio/hh443055.aspx)("SomeCapability"); + + +Project capability expressions can also be passed to the IsCapabilityMatch +method in order to test for combinations of capabilities (including +AND, OR, NOT logic). Read more about [the supported syntax and +operators](http://msdn.microsoft.com/en-us/library/vstudio/microsoft.visualstudio.shell.interop.ivsbooleansymbolexpressionevaluator.evaluateexpression.aspx). + +Common project capabilities and where they are defined +------------------------------------------------------ + + +### Existing project capabilities + +Some capabilities are defined by default by Microsoft.Common.CurrentVersion.targets. +Be sure to review that file if capabilities are defined that you do not wish +to be defined. You may find that you need to set the DefineCommonCapabilities +property to false to suppress these capabilities. + + +Please see this Excel spreadsheet for current and spec'd project capabilities + + +[http://devdiv/sites/vsplat/vside/Shared%20Documents/Project%20and%20Build/CPS/Designs/Project%20Capability%20actuals.xlsx?web=1](http://devdiv/sites/vsplat/vside/Shared%20Documents/Project%20and%20Build/CPS/Designs/Project%20Capability%20actuals.xlsx?web=1) + + +Important: please respect the formulas in this spreadsheet. Do not modify +the Bugs or Actuals worksheets and do not add/delete/modify the rows or +columns. Just modify the content of the middle cells in Expected, and add +project capabilities to the bottom or project types to the right. + + +Legend: + + U = Unconfigured Project scope (capabilities appear in Unconfigured + and Configured scopes) + + C = Configured Project scope only + + Bold = already shipped + + +### How do I define my own project capabilities? + +Project capabilities can be defined in several ways, the easiest of which +being to add this MSBuild item to your .targets file: + + + + +It's very important that project capabilities you define fit this criteria: + +- Names a specific technology, type, function, subset, etc. that is actually what you depend on and/or provide. + - For example: WindowsAppContainerPackagedApp, ResolveAssemblyReferences, ResolveComReferences, WindowsXaml +- Not merely a brand name, a code name, or a broad idea. + - Bad examples: Windows8, WindowsPhone, Metro, Immersive, Modern, CodeSharing +- More complex than a noun. Perhaps VerbNoun. A capability is something the project can do rather than something it is. Think of a term that can complete the sentence "I can…" + - Bad: 'android'. It does not sufficiently describe a capability but merely names a technology. Does this project build on android or for android? Does it build the android platform itself? Does it build androids? + - Good: BuildAndroidTarget +- Have a namespace prefix, or otherwise sufficiently unique so as to keep the odds of it colliding with a project capability someone else (including outside MSFT) might come up with. + - Good: Microsoft.XYZ.Concurrency + - Bad: Concurrency +- Avoid acronyms: + - Good: CSharp + - Bad: VB +- May include a version number, where necessary, but this is usually discouraged. + +Please email vscpsfte@microsoft.com before defining your own new project +capabilities so we can help review for compliance with the above guidelines +and help you define/consume these in the best way for your requirements. + +Note that the link is not publicly accessible + diff --git a/Documentation/Project_configurations.md b/Documentation/Project_configurations.md new file mode 100644 index 0000000..6057deb --- /dev/null +++ b/Documentation/Project_configurations.md @@ -0,0 +1,128 @@ +Project configurations +====================== + +Project configuration is the key to hint the project system how the project +will be built, deployed, debugged, etc. The project configuration represents +as a combination of 'Configuration' and 'Platform', i.e. 'Debug|AnyCPU', +'Release|x86', etc. In general a project might have multiple project +configurations, and only one project configuration could be active. The +active project configuration is set by the user via the Configuration +Manager dialog. + + +How does CPS know the project configurations? + +CPS has 2 built-in strategies to figure out the project configurations. +The activated strategy is determined by project capability. + + +If the project has the capability named 'ProjectConfigurationsDeclaredAsItems', +then CPS will crawl the project file and the imports and gather the +'ProjectConfiguration' items. By convention, the 'ProjectConfiguration' +items should be grouped and put into one ItemGroup element with the label +'ProjectConfigurations', and they should be saved in the project file. + + +i.e. + + + + + + + Debug + + AnyCPU + + + + + + Debug + + ARM + + + + + + +If the project has the capability named 'ProjectConfigurationsInferredFromUsage', +then CPS will crawl the project file and imports and gather the project +configuration through the usages in conditions. + + +i.e. + + + + + true + + full + + false + + bin\Debug\ + + DEBUG;TRACE + + prompt + + 4 + + + + + + pdbonly + + true + + bin\Release\ + + TRACE + + prompt + + 4 + + + + +Surely a new project type based on CPS could define a 3rd capability to +implement yet another strategy to figure out the project configurations. +For example, Asp.Net 5 project is based on CPS and it implements a different +strategy to read the project configurations from the project.Json file. + + +How do I implement my own strategy for the project configurations? + +- Choose a distinguished capability name for the new strategy. e.x. 'ProjectConfigurationsFromProjectJson' +- Implement and export IProjectConfigurationsServiceInternal with the AppiesTo() being set to that capability. + i.e. + + [Export(typeof(IProjectConfigurationsService))] + + [AppliesTo("ProjectConfigurationsFromProjectJson")] + + internal class ProjectJsonConfigurationsService : + IProjectConfigurationsServiceInternal + + { + + } + +- Include that capability in the common targets file. + i.e. + + + + + + + +- Ensure the 2 built-in capabilities "ProjectConfigurationsDeclaredAsItems" and "ProjectConfigurationsInferredFromUsage" are not defined in the common targets file. diff --git a/Documentation/Property_pages.md b/Documentation/Property_pages.md new file mode 100644 index 0000000..7fe51e9 --- /dev/null +++ b/Documentation/Property_pages.md @@ -0,0 +1,53 @@ +Property pages +============== + +You can define your own custom property pages that can be displayed by +Visual Studio for Projects, Project items, Debuggers, Compiler options, +etc. + + +This is done using a data driven model, by defining a set of "xaml rules" +that get referenced from the .targets file using the PropertyPageSchema +tag. + + +When you create a new Project Type, you get out of the box a comprehensive +set of such xaml rules that you can use as a model: + +**WARNING: There is a table here that must be manually transcribed!** + + +For more details, please refer to the following blog posts: + +[http://blogs.msdn.com/b/vsproject/archive/2009/06/10/platform-extensibility-part-1.aspx](http://blogs.msdn.com/b/vsproject/archive/2009/06/10/platform-extensibility-part-1.aspx) + +[http://blogs.msdn.com/b/vsproject/archive/2009/06/18/platform-extensibility-part-2.aspx](http://blogs.msdn.com/b/vsproject/archive/2009/06/18/platform-extensibility-part-2.aspx) + + +These properties get compiled into .cs at build time + + +Note: In Visual Studio, when you create a new xaml file, by default, it +gets included into the project as "Page". You will need to change it to +be + + + custom property pages + + + +TODO + + +MSBuild "Rules" + + +What are rules? + +· We provide out of the box (wizard) a large set of rules, what +do they represent? + +· Where can users find documentation about each of them + + + diff --git a/Documentation/Property_value_editors.md b/Documentation/Property_value_editors.md new file mode 100644 index 0000000..1b5b333 --- /dev/null +++ b/Documentation/Property_value_editors.md @@ -0,0 +1,11 @@ +Property value editors +====================== + +[IPropertyPageUIValueEditor](http://index/Microsoft.VisualStudio.ProjectSystem.V12Only/A.html#a053a2b21050a67c) + + +From <[http://index/Microsoft.VisualStudio.ProjectSystem.VS.Implementation/PropertyPages/DefaultFilePropertyEditor.cs.html](http://index/Microsoft.VisualStudio.ProjectSystem.VS.Implementation/PropertyPages/DefaultFilePropertyEditor.cs.html)> + + +TODO: add docs here + diff --git a/Documentation/Provide_custom_icons_for_the_Project_TypeItem_type.md b/Documentation/Provide_custom_icons_for_the_Project_TypeItem_type.md new file mode 100644 index 0000000..f7f5d39 --- /dev/null +++ b/Documentation/Provide_custom_icons_for_the_Project_TypeItem_type.md @@ -0,0 +1,6 @@ +Provide custom icons for the Project Type/Item type +=================================================== + +By exporting an [IProjectTreeModifier](IProjectTreeModifier.md) that +applies the icons to the nodes you require. + diff --git a/Documentation/Query_output_groups.md b/Documentation/Query_output_groups.md new file mode 100644 index 0000000..9752235 --- /dev/null +++ b/Documentation/Query_output_groups.md @@ -0,0 +1,16 @@ +Query output groups +=================== + +Having [obtained a ConfiguredProject](Finding_CPS_in_a_VS_project.md), +obtain the reference to the IOutputGroupsService: + + +IOutputGroupsService outputGroupsService = configuredProject.Services.OutputGroups; + +var outputGroup = await outputGroupsService.GetOutputGroupsAsync("Built"); + + +Remember that if you need to synchronously block on the result +instead of "await"ing it, that you follow [the threading +rules](onenote:..\VS%20Threading.one#VS%20Scenarios§ion-id={46FEAAD0-0131-45EE-8C52-C9893F1FD331}&page-id={2C8E6F9B-46BF-448D-B0EE-142C1DCF3C10}&end&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo). + diff --git a/Documentation/Reference_Manager.md b/Documentation/Reference_Manager.md new file mode 100644 index 0000000..bc62106 --- /dev/null +++ b/Documentation/Reference_Manager.md @@ -0,0 +1,3 @@ +Reference Manager +================= + diff --git a/Documentation/Responsive_design.md b/Documentation/Responsive_design.md new file mode 100644 index 0000000..0e42ed6 --- /dev/null +++ b/Documentation/Responsive_design.md @@ -0,0 +1,88 @@ +Responsive design +================= + +CPS has what we call a "responsive design". This isn't in reference to UI +responsiveness, but rather a description of how much of CPS is architected. + + +### A traditional project system + +In a traditional project system, when code changes the project file, that +same code is responsible for everything else the IDE expects, such as: + +- Updating a view model (the model that drives Solution Explorer) +- Update running document table as necessary +- Raise IVsTrackProjectDocuments events +- Invoke single file generators +This means that every place where code changes the project file, that code +must have complete knowledge of their host environment and fulfill all the +requirements of that hosting environment. In traditional project systems, +this isn't too bad because there is a fixed and small number of mutating +operations in the project system and maintaining them, or adding one more +once or twice a cycle, is manageable. + +All mutations and events are raised synchronously on the main thread. +Mutations that necessarily take a long time (like those requiring a +design-time build to complete) must block the UI thread for potentially +long periods for the operation to complete. + +The object model is mutable and private, so clients that discover project +system data always clone it into their own object models, resulting in +project data replication and increased VM usage. + + +### Responsive Design + +In CPS, when code changes the project file, that's all it does. It's job +is over. The rest of the steps that must accompany that change based on +the host (Visual Studio) are implemented elsewhere by other CPS extensions +(many of them built-in). After a project change is completed and the project +write lock released, CPS takes an immutable snapshot of the updated project. +It then compares the new snapshot to the old snapshot to produce a diff. +In this way, it can discern all the effects of the changes (including the +side effects that may not have been intended by the original mutation) +and take appropriate actions. + +Project data can be discovered by legacy clients of project systems via the +legacy IVs* interfaces, which all respond based on this immutable snapshot +of project data. This allows project mutations to occur on background +threads without compromising backward compatibility with STA clients that +expect the project to not change while they're on the UI thread. + +#### Why did we create this? + +We were actually somewhat driven into this design during the Dev11 cycle +while writing "CPS-VS" for Javascript projects. The issue was we really +wanted to allow concurrency for project reads. That required introducing +locks. Locks are pretty incompatible with an STA thread in managed code +since blocking an STA on a contested lock invites reentrancy and has +been shown to cause crashes, corruption, and hangs. So by saying we want +concurrent reads, all reads and writes have to be off the STA thread. But +being off the STA for changes makes raising events on the STA for those +changes, and protecting clients from seeing changes midway, required a +design that included immutable snapshots for the STA and being able to +raise events after the project change had previously completed. + +We have found that this design has some very unique pros and cons, the +magnitude of some of them could not be appreciated until we'd implemented +it. + + +#### Advantages to Responsive Design: + +- The same code that performs project file changes is rehostable. It can work equally well in VS as in Napa, or other hosts, regardless of their requirements for specific eventing or threading models. + - Project system extensions can be written that have no knowledge of or complexity from the rules that have to be followed based on the host. +- Additional events can be defined and raised appropriately with changes only to a concentrated area of code rather than updating all locations that happen to mutate the project in a way that should raise the event. +- Arbitrary changes to the project file can be consumed, and the right events get raised to update the IDE, which enables scenarios such as: + - The user editing the project file in the text editor while it is still open, and the project system responds to changes the user makes. + - SCC operations such as Undo & Get Latest Version don't have to reload the project when the project file is changed. +- Provides opportunity for concurrency and asynchronous execution, leaving the IDE responsive during background or long-running work. +- Bulk changes can be made to the project file and only raise minimal events for the net changes that were applied to the project file. +- Unpredictable side effects of project file changes are automatically accounted for, whereas traditional project systems will be unaware of them until a project reload, or (worse) in the middle of the project's lifetime resulting in misbehavior. +- Project system clients can subscribe to project data and get exactly the events and change descriptions that they want, in snapshot form so they can have confidence they don't have to clone all the data into their own proprietary copy of the project object model. +#### Disadvantages to Responsive Design: + +- Project snapshot diff's don't always capture important semantics of the original changes. For example, a rename is significantly different from a delete and an add in how the host expects to see events raised. Preserving these semantics sometimes requires extra code on the mutation side to tuck hints away for later discovery by the diffing system. We minimize this burden by adding these hints to shared code so that folks can still mutate the project simply, but the code is nevertheless in CPS, making the codebase non-traditional and a bit more complex. +- The project tree data structure itself has a particularly tough job when accommodating project changes. The code in this area has very deep conditional branching and it's a lot of dev and testing work to have confidence that it covers the required scenarios. It's unlikely that, in its current form anyway, it could ever really handle any arbitrary project change, although it seems we can maintain a codebase that handles the subset of project changes that the IDE in practice actually performs. +- Integration with the VS running document table has been a particularly buggy area historically. +- Asynchronous, distributed responses to project changes are harder to predict and follow while developing or debugging code than the traditional imperative style where one method is responsible for everything and doesn't return until it's done. diff --git a/Documentation/Scopes.md b/Documentation/Scopes.md new file mode 100644 index 0000000..d997fe1 --- /dev/null +++ b/Documentation/Scopes.md @@ -0,0 +1,167 @@ +Scopes +====== + +### Introduction to scopes + +In Visual Studio there are three "scopes" of context related to project +systems: + +- IVsSolution, or the global context. There is exactly one of these in the process. +- IVsProject, or the project context. There is exactly one of these per project in the solution. +- IVsProjectCfg, or the project configuration context. There is exactly one of these for each build configuration, for each project, in the solution. + +These contexts can be represented in a hierarchy: + +- Visual Studio process + - IVsSolution + - IVsProject (a.csproj) + - IVsProjectCfg (Debug|AnyCPU) + - IVsProjectCfg (Release|AnyCPU) + - IVsProjectCfg (Debug|x86) + - IVsProjectCfg (Release|x86) + - IVsProject (b.vcxproj) + - IVsProjectCfg (Debug|Win32) + - IVsProjectCfg (Release|Win32) + +CPS has these three context scopes as well. But they are known by the CPS +concept names rather than their VS-specific equivalents. Here they are +with their equivalents: + +**WARNING: There is a table here that must be manually transcribed!** + + +Any code in VS may obtain the ProjectService or IVsSolution because there +is just one in the process. + +Code that wants an UnconfiguredProject (or IVsProject) must either already +be operating at that context to obtain it, or must ask its parent context +for the project-specific context by naming the project to be obtained. + +Code that wants a ConfiguredProject (or IVsProjectCfg) must similarly +belong to that context or first retrieve an UnconfiguredProject and then +request the ConfiguredProject by configuration name. + + +Note that ProjectService scope is not equivalent to the VS default MEF container. +ProjectService is a scope beneath the default container and [must be obtained from the +IProjectServiceAccessor](onenote:Documentation.one#Obtaining%20the%20ProjectService§ion-id={768BD288-CDB5-4DCE-83D2-FC3994703CEA}&page-id={213C67CF-0707-470E-903D-1451517B2F73}&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo/CPS), +which itself is defined in the VS default container. + + +### Scopes at odds + +Because CPS projects are MSBuild based which has a project file format +in which nearly everything can be an expression and therefore may vary by +project configuration, most of CPS services for querying or manipulating +project data are implemented in the ConfiguredProject scope. This is +at odds with VS which expects most project data to be exposed at the +IVsProject context. For example, the IVsProject object is expected to +be able to enumerate items in the project, but items in MSBuild are the +result of MSBuild evaluation (since they may include MSBuild expressions or +conditions) so items can only be obtained from the IVsProjectCfg context. + +To rectify this disparity, CPS can 'lift' services that are defined in the +ConfiguredProject scope into the UnconfiguredProject scope. As there are +many ConfiguredProject scopes that are children of an UnconfiguredProject +scope, CPS picks the ConfiguredProject associated with the active project +configuration. The active project configuration is a VS concept that dictates +that for a given project, at most one configuration can be 'active'. CPS +synchronizes with the VS concept of active project configuration so that +CPS always uses the active ConfiguredProject as its source for data when +it is queried for it at the UnconfiguredProject scope. + + +### Which scope should I operate at? + +The short answer is that if your code operates at the project level (that +is, you want one instance of your service per project) you should export +it to the UnconfiguredProject scope. Otherwise if you want your service +to have an instance for each individual configuration you should export +it to the ConfiguredProject scope. + + +### Controlling the MEF scope your MEF part is exported to + +### MEF parts belong to the scope necessary to satisfy all of its imports. A MEF part that imports nothing belongs to the 'default' or global scope. A MEF part that imports anything from the ConfiguredProject scope belongs to the ConfiguredProject scope as well (unless it does so via the ActiveConfiguredProject wrapper). A MEF part that imports anything from the ConfiguredProject + + +**WARNING: There is a table here that must be manually transcribed!** + + + +### Importing ConfiguredProject MEF exports at the UnconfiguredProject level + +This ability to 'lift' data upward from ConfiguredProject to UnconfiguredProject +scope is exposed to you in at least two ways. If you simply want to access +ConfiguredProject data that CPS exposes while you're at the UnconfiguredProject +context the easiest way is often to query for the service stub that CPS often +exposes at the UnconfiguredProject scope. For example, if you want to get +the IProjectSubscriptionService, which is exported to the ConfiguredProject +scope, you can instead get the IActiveConfiguredProjectSubscriptionService, +which is available at the UnconfiguredProject scope. + + +When you are defining a MEF part that is exported to the UnconfiguredProject +scope, you may import ConfiguredProject-scoped services using the +ActiveConfiguredProject wrapper. This is a MEF open-generic export +that you can import, providing your own T, where T is an export from the +ConfiguredProject scope. Note this technique only works when T is exported +with the default MEF contract name for T. So for example, if you want to +import the IBuildProject service from the active configuration from your +UnconfiguredProject MEF part, you can use this syntax: + + [Import] + + ActiveConfiguredProject BuildProject { get; set; } + + +Note that the generic type argument can even be ConfiguredProject itself: + + [Import] + + ActiveConfiguredProject ActiveConfiguredProject { +get; set; } + + +Most commonly, it's useful to define your own private nested class that +imports everything you need from the ConfiguredProject scope, and then +import that: + + + [Export] + + class MyUnconfiguredProjectPart { + + [Import] + + UnconfiguredProject Project { get; set; } + + + [Import] + + ActiveConfiguredProject ActiveConfigurationExports +{ get; set; } + + + [Export] + + class ConfiguredProjectHelper { + + [Import] + + internal ConfiguredProject ConfiguredProject { get; set; } + + + [Import] + + internal IBuildProject BuildProject { get; set; } + + } + + } + +Q: Is there a way to know which services belong to which scope (e.g. naming +convention)? + +A: No. Just documentation. But I hope we have a better answer in VNext + diff --git a/Documentation/Special_nodes_under_projects_in_Solution_Explorer.md b/Documentation/Special_nodes_under_projects_in_Solution_Explorer.md new file mode 100644 index 0000000..06ddd1b --- /dev/null +++ b/Documentation/Special_nodes_under_projects_in_Solution_Explorer.md @@ -0,0 +1,26 @@ +Special nodes under projects in Solution Explorer +================================================= + +To add nodes directly under the project node in Solution Explorer of a +CPS-based project, you must export an IProjectTreeProvider with a specific +contract name, as shown here: + + +[AppliesTo("[Project capability expression here](Extensibility_points.md)")] + +[[Export](http://index/System.ComponentModel.Composition/A.html#e2e3ab45244b3c5a)([ExportContractNames](http://index/Microsoft.VisualStudio.ProjectSystem.Utilities.v12.0/A.html#924888bb0497d319).[ProjectTreeProviders](http://index/Microsoft.VisualStudio.ProjectSystem.Utilities.v12.0/A.html#a287b13bfa7423f9).[PhysicalViewRootGraft](http://index/Microsoft.VisualStudio.ProjectSystem.Utilities.v12.0/A.html#96d723950e82431b), +typeof([IProjectTreeProvider](http://index/Microsoft.VisualStudio.ProjectSystem.V12Only/A.html#69b8897bf6b80a6d)))] + +internal class YourSubtreeProvider : +[ProjectTreeProviderBase](http://index/Microsoft.VisualStudio.ProjectSystem.Utilities.v12.0/A.html#3b3152ccda3f6fa8) + +{ + + // implementation goes here + +} + + +For reference, you can check out [the References folder for CPS-style C#/VB +projects](http://index/#Microsoft.VisualStudio.ProjectSystem.Implementation/Designers/ReferencesProjectSubtreeProvider.cs,7beeae066dc18866,references). + diff --git a/Documentation/Subscribe_to_project_data.md b/Documentation/Subscribe_to_project_data.md new file mode 100644 index 0000000..77b5069 --- /dev/null +++ b/Documentation/Subscribe_to_project_data.md @@ -0,0 +1,81 @@ +Subscribe to project data +========================= + +To read some subset of data (i.e. properties and/or items) from the project +and be notified when that data changes: + + +private IDisposable SubscribeToProjectData( + + UnconfiguredProject unconfiguredProject, + + Func, + System.Threading.Tasks.Task> receiver, + + params string[] ruleNames) + +{ + + var subscriptionService = unconfiguredProject.Services.ActiveConfiguredProjectSubscription; + + var receivingBlock = new ActionBlock>(receiver); + + return subscriptionService.JointRuleSource.SourceBlock.LinkTo(receivingBlock, + ruleNames: ruleNames); + +} + + +private async Task ProjectUpdateAsync(IProjectVersionedValue +update) { + + // This runs on a background thread. [Switch to the Main + thread](onenote:..\VS%20Threading.one#VS%20Scenarios§ion-id={46FEAAD0-0131-45EE-8C52-C9893F1FD331}&page-id={2C8E6F9B-46BF-448D-B0EE-142C1DCF3C10}&object-id={2CD5FFFB-CB6F-4AE0-8774-BF357A019765}&D&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo) + (if necessary): + + await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); + + + // Process the update. + + // Either in terms of what's currently there… + + var typeScriptCompileItems = update.Value.CurrentState["TypeScriptCompile"].Items; + + // …or in terms of what has been added or removed recently: + + var changes = update.Value.ProjectChanges["TypeScriptCompile"].Difference; + + + // Note that the first time this callback is invoked, all current + items are presented as if they have just been added. + + // This allows you to always code in terms of the diff, and it + automatically just works the first time. + + // If you don't like this behavior, you can turn it off by passing + "initialDataAsNew: false" into the LinkTo method. + +} + + +UnconfiguredProject unconfiguredProject; // obtained as [described +here](Finding_CPS_in_a_VS_project.md) + +IDisposable disposeToUnsubscribe = SubscribeToProjectData(unconfiguredProject, +ProjectUpdateAsync, "TypeScriptCompile"); + +// Note that ProjectUpdateAsync is called asynchronously, + +// so it probably hasn't been invoked by the time SubscribeToProjectData +has returned. + + +To subscribe to the entire set of source items (which is an open set, as +in CPS this is extensible by the customer): + +TODO + + +TODO: talk about the various source blocks (including ProjectBuildRuleBlock) + diff --git a/Documentation/Sync_up_shims_to_latest_project_model.md b/Documentation/Sync_up_shims_to_latest_project_model.md new file mode 100644 index 0000000..b7931d1 --- /dev/null +++ b/Documentation/Sync_up_shims_to_latest_project_model.md @@ -0,0 +1,15 @@ +Sync up shims to latest project model +===================================== + +After using the new CPS APIs to update a project, you may at times need to +know when (and perhaps expedite) the IVsHierarchy, DTE, and other legacy +shims have been updated with the latest project state. + + +To accomplish this, you must [acquire](Finding_CPS_in_a_VS_project.md) the +[IProjectTreeService](http://index/#Microsoft.VisualStudio.ProjectSystem.V14Only/Designers/IProjectTreeService.cs,3b84de0f37919a5c,references) +export and call its + +PublishLatestTreeAsync method. That method returns a Task that completes +when the IVsHierarchy object model has been updated. + diff --git a/Documentation/The_Project_Lock.md b/Documentation/The_Project_Lock.md new file mode 100644 index 0000000..c401ec6 --- /dev/null +++ b/Documentation/The_Project_Lock.md @@ -0,0 +1,78 @@ +The Project Lock +================ + +You're only required to take your own project lock if you're accessing +msbuild objects directly. If you're going through a CPS service which +internally access MSBuild, you can assume that service is taking the +necessary locks. + +You may want to take a project lock in your code even if you don't access +MSBuild directly in order to signify a larger transaction (or batch of +changes). For instance, if you're adding several items to the project, +you could take a project write lock and hold it while adding all items. +This will cause CPS to recognize the several items being added as a single +batch and CPS will not process the changes you make until you release the +lock. + + +### Overview + +The project lock in CPS guards the MSBuild object model for thread-safe +access. MSBuild by itself is not thread-safe, so it is vitally important +that you possess a CPS project lock whenever you access or have references +to MSBuild objects. + + +#### Concurrency / Isolation + +The project lock is similar to the ReaderWriterLockSlim class, in that it +allows many concurrent readers and exclusive access for writers. Someone +holding a read lock is not allowed to acquire a write lock -- the read +lock must be released first. There is a special "upgradeable reader" lock +type that allows concurrent readers to execute, and also allows upgrading +to write lock, at which point it blocks until other readers release their +locks and then grants an exclusive write lock till you release it, at +which point it reverts to an upgradeable read lock again. + +Nesting project locks is allowed. But remember that ordinary read locks +are not upgradeable. + + +#### Threading + +Project locks are issued asynchronously. If a project lock cannot be +immediately assigned to you, your async method will yield and will resume +when the lock has been issued. + +Project locks are always on threadpool threads. If you're on the UI thread +when you ask for a project lock, your method will resume with the issued +lock on the threadpool. + +Releasing a lock does not automatically restore you to your previous thread. To get back +to the UI thread after releasing a project lock, refer to [How do I switch to the UI +thread?](onenote:..\VS%20Threading.one#VS%20Scenarios§ion-id={F67B08B3-2B6A-4472-A492-EEE6749BF8A3}&page-id={2C8E6F9B-46BF-448D-B0EE-142C1DCF3C10}&object-id={9A020A2C-CF6B-4BBF-8141-5CF2D10AE7E1}&A1&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo) +but use IThreadHandling.AsyncPump instead of ThreadHelper.JoinableTaskFactory. + +It is allowed to switch back to the UI thread while holding a project +lock, but this is for purposes of calling 3rd party code when absolutely +required and should be avoided when possible. Do not reference MSBuild +objects while on the UI thread. You may release your project lock from +any thread. + + +### How to obtain a project lock + +See [Obtaining the MSBuild.Project from CPS](Obtaining_the_MSBuild.Project_from_CPS.md) +for an example. + + +### DO's and DON'Ts + +- DO always take a project lock when accessing MSBuild objects. +- DON'T ever retain a reference to an MSBuild object beyond the scope of your project lock. +- DO always call CheckoutAsync on the lock object passing in the full path of the project file you're going to change before making your change. Feel free to call it frequently. It efficiently no-ops if you've called it with the same path in the same project lock already. +- DON'T hold a project lock for a long period of time. Doing so may prevent other concurrently executing code from obtaining a lock. +- DON'T access MSBuild objects while on the UI thread, even if you are holding a project lock. Project locks aren't considered 'active' while you're on the UI thread, even if you have not yet released it. +- DON'T use ThreadHelper.JoinableTaskFactory in your code once you start interacting directly with the CPS project lock. Import the IThreadHandling service (via MEF) and use the IThreadHandling.AsyncPump instance of JoinableTaskFactory instead. This will mitigate deadlocks that can result between someone holding the UI thread and wanting a project lock, and you holding a project lock and wanting the UI thread. +- DON'T try to circumvent the asynchronous nature of the project lock. Calling ReadLockAsync().Wait() or any other synchronously blocking variant will cause your code to malfunction. If you must block the calling thread while doing work with a project lock, you may use IThreadHandling.AsyncPump.Run(Func) for that purpose. See [Block a thread while doing async work](onenote:..\VS%20Threading.one#VS%20Scenarios§ion-id={F67B08B3-2B6A-4472-A492-EEE6749BF8A3}&page-id={2C8E6F9B-46BF-448D-B0EE-142C1DCF3C10}&object-id={9A020A2C-CF6B-4BBF-8141-5CF2D10AE7E1}&68&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo) for more information on that, but remember to use IThreadHandling.AsyncPump instead of ThreadHelper.JoinableTaskFactory. +- DO be aware that when you have a project lock and request the UI thread, that your lock may be lent out to someone controlling the UI thread and wanting a project lock. This is the lesser of two evils, where the other evil is a deadlock. diff --git a/Documentation/Threading_model.md b/Documentation/Threading_model.md new file mode 100644 index 0000000..9d87bd3 --- /dev/null +++ b/Documentation/Threading_model.md @@ -0,0 +1,24 @@ +Threading model +=============== + +CPS requires strict adherence to the rules and guidelines at [3 Threading +Rules](3_Threading_Rules.md) + + +Important: + + Do not call Task.Wait() or Task.Result in your code because these + violate [threading rule #2](3_Threading_Rules.md) and will often lead + to deadlocks. + + +Avoid use of ThreadHelper.JoinableTaskFactory as that does not have the intelligence +to mitigate deadlocks between the UI thread and the CPS project lock. Instead, +use a CPS-specific JoinableTaskFactory instance, such as the one found on +[IThreadHandling.AsyncPump](http://index/#Microsoft.VisualStudio.ProjectSystem.V14Only/IThreadHandling.cs,a5d499f7dd5e045e,references). + + +Alternately if you want to create your own JoinableTaskFactory instance (for +example to associate with your own JoinableTaskCollection) you can call +IThreadHandling.JoinableTaskContext.CreateFactory(joinableTaskCollection). + diff --git a/Documentation/WARNING_to_folks_taking_a_CPS_dependency.md b/Documentation/WARNING_to_folks_taking_a_CPS_dependency.md new file mode 100644 index 0000000..2cdb5ff --- /dev/null +++ b/Documentation/WARNING_to_folks_taking_a_CPS_dependency.md @@ -0,0 +1,28 @@ +WARNING to folks taking a CPS dependency +======================================== + +WARNING: The CPS APIs are not stable. Any dependency you take on them means you will have to recompile (and possibly change source code) for each major release of VS. +---------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + +TODO: Expand on below points + + +[Itemid changes](onenote:Documentation.one#ItemIDs§ion-id={768BD288-CDB5-4DCE-83D2-FC3994703CEA}&page-id={B30BC875-A380-4FE1-9010-F9A4D3F30727}&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo/CPS) + +Extensibility story (no flavors, several but limited extensibility points) + +Supporting arbitrary item types not listed + +Project load performance has few optimizations - work in progress + +No default app designer pages built into CPS + + +### Your Obligations + +By building on CPS, you solemnly swear to: + +- Respect [project capabilities](Project_Capabilities.md). Define them exactly when appropriate (no more, no less). This means your team will not punt bugs filed against your project type that describe inappropriately defined project capabilities. These bugs may not cause problems in your scenarios -- but project capabilities are part of your public surface area and are very important to get right to avoid regressions in other teams' scenarios, and to ensure confidence to 3rd parties who use project capabilities as their means of recognizing project types. +- Focus your [AppliesTo] exports to exactly the set of scenarios you intend to impact. Remember if you understate the restrictions that you can impact partner's or customer's scenarios in adverse ways. +- Honor the VS [threading rules](onenote:..\VS%20Threading.one#Threading%20Rules§ion-id={F67B08B3-2B6A-4472-A492-EEE6749BF8A3}&page-id={D0EEFAB9-99C0-4B8F-AA5F-4287DD69A38F}&end&base-path=http://devdiv/sites/vspe/prjbld/OneNote/TeamInfo) diff --git a/Documentation/What_is_CPS.md b/Documentation/What_is_CPS.md new file mode 100644 index 0000000..be5d002 --- /dev/null +++ b/Documentation/What_is_CPS.md @@ -0,0 +1,45 @@ +What is CPS? +============ + +Introduction +------------ + +CPS stands for the Common Project System. It is a unified, extensible, +scalable, performant project system that ships in the box with Visual +Studio and is also rehostable to other hosts such as Blend and Azure web +applications. + + +### Why CPS? + +Every language in VS has at least one project system behind it, and sometimes +more. Each language also has many "flavors" that ship in the box. More +languages and more flavors also ship as extensions to VS. Each of these +comes with large source code bases and binary images that must be loaded +in memory. Inconsistent behaviors between project system implementations +make writing a component that interacts with more than one type of project +very difficult. Documentation on expected behavior is sparse and often +ambiguous. + +CPS targets replacing all the project systems Microsoft ships, and allowing +3rd parties to also replace their own, with just one Common project system +implementation that can be extended on a per-project basis to provide the +unique experiences a type of project may require, but with very consistent +behaviors everywhere else. + +CPS has been designed with modern requirements in mind, so rebasing a +project system on CPS automatically gives it the promise of rehostability +(Monaco, Azure, Blend), scalability and performance that customers demand +for their large solutions. + + +### Where can I find more documentation? + +This OneNote section probably has the most up to date information. But +lots more documentation in varying states of decay exists on Sharepoint: + +- [CPS Specs](http://devdiv/sites/vspe/prjbld/Lists/CPS%20Specs/AllItems.aspx) +- [CPS Extensibility](http://devdiv/sites/vspe/prjbld/Lists/CPS%20Extensibility/AllItems.aspx) +- [CPS Design docs](http://devdiv/sites/vspe/prjbld/Lists/CPS%20Specs/AllItems.aspx) +We also have some [brownbag videos](file:///\\andarno3\public\CPS%20Brownbag%20videos) + diff --git a/Documentation/Who_holds_a_project_lock.md b/Documentation/Who_holds_a_project_lock.md new file mode 100644 index 0000000..d20ddeb --- /dev/null +++ b/Documentation/Who_holds_a_project_lock.md @@ -0,0 +1,1042 @@ +Who holds a project lock? +========================= + +The ProjectLockService.dgml file tells me I have several clients waiting +on a lock, and one client holding an upgradeable read lock. + +![](Images/Fig_5.png) + +I know the lock is involved in the hang because the async state machine +responsible for blocking the main thread is blocked because it can't get +a read lock. + + +Who is holding the upgradeable read lock? WinDBG can help us find the +answer. + + +0:000> !dumpheap -stat -type ProjectLockService + +Statistics: + + MT Count TotalSize Class Name + +62d3963c 1 12 +System.Lazy`1+Boxed[[Microsoft.VisualStudio.ProjectSystem.IProjectLockServiceInternal, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + +62bf05c8 1 12 System.Lazy`1+Boxed[[Microsoft.VisualStudio.ProjectSystem.ProjectLockService, +Microsoft.VisualStudio.ProjectSystem.Implementation]] + +62d370d8 1 20 System.Lazy`1[[Microsoft.VisualStudio.ProjectSystem.IProjectLockServiceInternal, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + +62be0268 1 20 System.Lazy`1[[Microsoft.VisualStudio.ProjectSystem.ProjectLockService, +Microsoft.VisualStudio.ProjectSystem.Implementation]] + +62d379cc 1 32 System.Func`1[[Microsoft.VisualStudio.ProjectSystem.IProjectLockService, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + +62d3712c 1 32 System.Func`1[[Microsoft.VisualStudio.ProjectSystem.IProjectLockServiceInternal, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + +62be845c 1 32 System.Func`1[[Microsoft.VisualStudio.ProjectSystem.ProjectLockService, +Microsoft.VisualStudio.ProjectSystem.Implementation]] + +62a05eac 1 32 Microsoft.VisualStudio.ProjectSystem.ProjectLockService+AccessLockEnforcement + +62d395bc 5 60 System.Lazy`1+Boxed[[Microsoft.VisualStudio.ProjectSystem.IProjectLockService, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + +62d37978 5 100 System.Lazy`1[[Microsoft.VisualStudio.ProjectSystem.IProjectLockService, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + +62a060c4 5 100 Microsoft.VisualStudio.ProjectSystem.ProjectLockService+<>c__DisplayClass4 + +62a04af0 1 116 Microsoft.VisualStudio.ProjectSystem.ProjectLockService + +62a0611c 5 220 +Microsoft.VisualStudio.ProjectSystem.ProjectLockService+<>c__DisplayClass4+<b__6>d__0 + +Total 29 objects + +Fragmented blocks larger than 0.5 MB: + + Addr Size Followed by + +18aaa760 0.8MB 18b80bf0 System.Byte[] + +18b80c48 0.6MB 18c1692c System.Byte[] + +18c1aacc 0.8MB 18cea584 System.Byte[] + +18cec5a0 0.9MB 18dd7084 System.Byte[] + +18dd9090 1.2MB 18f04ea4 System.Byte[] + +18f434bc 3.6MB 192d5ff4 System.Byte[] + + +0:000> !dumpheap -mt 62a04af0 + + Address MT Size + +0bf21e20 62a04af0 116 + + +Statistics: + + MT Count TotalSize Class Name + +62a04af0 1 116 Microsoft.VisualStudio.ProjectSystem.ProjectLockService + +Total 1 objects + +Fragmented blocks larger than 0.5 MB: + + Addr Size Followed by + +18aaa760 0.8MB 18b80bf0 System.Byte[] + +18b80c48 0.6MB 18c1692c System.Byte[] + +18c1aacc 0.8MB 18cea584 System.Byte[] + +18cec5a0 0.9MB 18dd7084 System.Byte[] + +18dd9090 1.2MB 18f04ea4 System.Byte[] + +18f434bc 3.6MB 192d5ff4 System.Byte[] + + +0:000> !do 0bf21e20 + +Name: Microsoft.VisualStudio.ProjectSystem.ProjectLockService + +MethodTable: 62a04af0 + +EEClass: 628c47e8 + +Size: 116(0x74) bytes + +File: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.VisualStudio.ProjectSystem.Implementation\v4.0_14.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.ProjectSystem.Implementation.dll + +Fields: + + MT Field Offset Type VT Attr Value Name + +7188e0c8 400001e 4 System.Object 0 instance 0bf22720 +syncObject + +6d51d05c 400001f 8 ...ronizationContext 0 instance 0bf2272c +nonConcurrentSyncContext + +6d51d0cc 4000020 c ...tudio.Threading]] 0 instance 0bf22770 +topAwaiter + +6d4d288c 4000021 10 ...tudio.Threading]] 0 instance 0bf2283c +issuedReadLocks + +6d4d288c 4000022 14 ...tudio.Threading]] 0 instance 0bf228a8 +issuedUpgradeableReadLocks + +6d4d288c 4000023 18 ...tudio.Threading]] 0 instance 0bf228d0 +issuedWriteLocks + +6d4d2928 4000024 1c ...tudio.Threading]] 0 instance 0bf228f8 +waitingReaders + +6d4d2928 4000025 20 ...tudio.Threading]] 0 instance 0bf22928 +waitingUpgradeableReaders + +6d4d2928 4000026 24 ...tudio.Threading]] 0 instance 0bf22948 +waitingWriters + +… + + +0:000> !do 0bf228a8 + +Name: System.Collections.Generic.HashSet`1[[Microsoft.VisualStudio.Threading.AsyncReaderWriterLock+Awaiter, +Microsoft.VisualStudio.Threading]] + +MethodTable: 6d4d288c + +EEClass: 70497e24 + +Size: 40(0x28) bytes + +File: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll + +Fields: + + MT Field Offset Type VT Attr Value Name + +7188fb80 40006f6 4 System.Int32[] 0 instance 0c55b410 +m_buckets + +7094cb3c 40006f7 8 ...non, mscorlib]][] 0 instance 0c55b3b0 +m_slots + +7188fbb8 40006f8 14 System.Int32 1 instance 1 +m_count + +7188fbb8 40006f9 18 System.Int32 1 instance 1 +m_lastIndex + +7188fbb8 40006fa 1c System.Int32 1 instance -1 +m_freeList + +718c7cb0 40006fb c ...Canon, mscorlib]] 0 instance 0bf2289c +m_comparer + +7188fbb8 40006fc 20 System.Int32 1 instance 1455 +m_version + +71893580 40006fd 10 ...SerializationInfo 0 instance 00000000 +m_siInfo + + +0:000> !DumpArray /d 0c55b3b0 + +Name: System.Collections.Generic.HashSet`1+Slot[[Microsoft.VisualStudio.Threading.AsyncReaderWriterLock+Awaiter, +Microsoft.VisualStudio.Threading]][] + +MethodTable: 6d51e134 + +EEClass: 6d4e26f8 + +Size: 96(0x60) bytes + +Array: Rank 1, Number of elements 7, Type VALUETYPE + +Element Methodtable: 6d51e0f4 + +[0] 0c55b3b8 + +[1] 0c55b3c4 + +[2] 0c55b3d0 + +[3] 0c55b3dc + +[4] 0c55b3e8 + +[5] 0c55b3f4 + +[6] 0c55b400 + + +I then enumerate the array looking for valid dictionary entries. Because +each entry is a value-type, I have to use the appropriate syntax: + + +0:000> !dumpvc 6d51e0f4 0c55b3b8 + +Name: System.Collections.Generic.HashSet`1+Slot[[Microsoft.VisualStudio.Threading.AsyncReaderWriterLock+Awaiter, +Microsoft.VisualStudio.Threading]] + +MethodTable: 6d51e0f4 + +EEClass: 70499ff4 + +Size: 20(0x14) bytes + +File: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll + +Fields: + + MT Field Offset Type VT Attr Value Name + +7188fbb8 4000707 4 System.Int32 1 instance 40482544 +hashCode + +71891178 4000708 0 System.__Canon 0 instance 11b8cfb0 value + +7188fbb8 4000709 8 System.Int32 1 instance -1 next + +0:000> !do 11b8cfb0 + +Name: Microsoft.VisualStudio.Threading.AsyncReaderWriterLock+Awaiter + +MethodTable: 6d51d124 + +EEClass: 6d4e22ec + +Size: 60(0x3c) bytes + +File: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.VisualStudio.Threading\v4.0_14.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Threading.dll + +Fields: + + MT Field Offset Type VT Attr Value Name + +6d51cc58 40000ab 4 ...cReaderWriterLock 0 instance 0bf21e20 lck + +6d51dfc8 40000ac 20 System.Int32 1 instance 1 kind + +6d51d124 40000ad 8 ...riterLock+Awaiter 0 instance 00000000 +nestingLock + +7189a0c8 40000ae 28 ...CancellationToken 1 instance 11b8cfd8 +cancellationToken + +718d0a5c 40000af 2c ...TokenRegistration 1 instance 11b8cfdc +cancellationRegistration + +6d51e000 40000b0 24 System.Int32 1 instance 0 +options + +7188de70 40000b1 c System.Exception 0 instance 00000000 fault + +7189a934 40000b2 10 System.Action 0 instance 00000000 +continuation + +718998d0 40000b3 14 ...eading.Tasks.Task 0 instance 00000000 +releaseAsyncTask + +71898968 40000b4 18 ...ostics.StackTrace 0 instance 00000000 +requestingStackTrace + +7188e0c8 40000b5 1c System.Object 0 instance 00000000 data + +718c826c 40000aa b0 ...bject, mscorlib]] 0 shared static +cancellationResponseAction + + >> Domain:Value 013e8c60:0bf3374c << + +71897aa8 40000b6 b4 ...endOrPostCallback 0 shared static +CS$<>9__CachedAnonymousMethodDelegate1 + + >> Domain:Value 013e8c60:0bf3376c << + + +So I've found my awaiter that represents the lock. I need to find out who +is holding it. + + +0:000> !gcroot 11b8cfb0 + +Thread 1594: + + 0113e140 6d5068dc Microsoft.VisualStudio.Threading.JoinableTaskFactory.WaitSynchronouslyCore(System.Threading.Tasks.Task) +[f:\dd\vsproject\cps\Microsoft.VisualStudio.Threading\Microsoft.VisualStudio.Threading\JoinableTaskFactory.cs +@ 274] + + ebp+50: 0113e140 + + -> 0bf352c4 Microsoft.VisualStudio.ProjectSystem.Utilities.ProjectLockAwareJoinableTaskFactory + + -> 0377c514 Microsoft.VisualStudio.Threading.JoinableTaskContext + + -> 0377c648 System.Collections.Generic.HashSet`1[[Microsoft.VisualStudio.Threading.JoinableTask, +Microsoft.VisualStudio.Threading]] + + -> 0c2738cc System.Collections.Generic.HashSet`1+Slot[[Microsoft.VisualStudio.Threading.JoinableTask, +Microsoft.VisualStudio.Threading]][] + + -> 0ce64e78 Microsoft.VisualStudio.Threading.JoinableTask + + -> 0c6b1f68 Microsoft.VisualStudio.ProjectSystem.Utilities.ProjectLockAwareJoinableTaskFactory + + -> 0bf21e20 Microsoft.VisualStudio.ProjectSystem.ProjectLockService + + -> 0bf2272c Microsoft.VisualStudio.Threading.AsyncReaderWriterLock+NonConcurrentSynchronizationContext + + -> 0c5a96d8 System.Threading.Thread + + -> 03772fb4 System.Runtime.Remoting.Contexts.Context + + -> 037712e4 System.AppDomain + + -> 1198eca0 System.AssemblyLoadEventHandler + + -> 1198ec80 System.Object[] + + -> 0ccaeee0 System.AssemblyLoadEventHandler + + -> 0ccaed08 Microsoft.VisualStudio.Design.Toolbox.AutoToolboxManagerService + + ... + + -> 0ce91bf8 Microsoft.VisualStudio.ProjectSystem.Designers.ProjectDirectoryTreeProvider + + -> 11bdebfc Microsoft.VisualStudio.ProjectSystem.Designers.ProjectDirectoryTreeProvider+MyConfiguredProjectExports + + -> 1142f3b4 Microsoft.VisualStudio.ProjectSystem.PropertyPages.PropertyPagesDataModelProvider + + -> 1142f3f8 +Microsoft.VisualStudio.ProjectSystem.Utilities.OrderPrecedenceImportCollection`2[[Microsoft.VisualStudio.ProjectSystem.Designers.Properties.IDynamicEnumValuesProvider, +Microsoft.VisualStudio.ProjectSystem.V14Only],[Microsoft.VisualStudio.ProjectSystem.PropertyPages.IDynamicEnumCategoryMetadata, +Microsoft.VisualStudio.ProjectSystem.Implementation]] + + -> 1142f428 +System.Collections.Generic.List`1[[System.Lazy`2[[Microsoft.VisualStudio.ProjectSystem.Designers.Properties.IDynamicEnumValuesProvider, +Microsoft.VisualStudio.ProjectSystem.V14Only],[Microsoft.VisualStudio.ProjectSystem.PropertyPages.IDynamicEnumCategoryMetadata, +Microsoft.VisualStudio.ProjectSystem.Implementation]], +System.ComponentModel.Composition]] + + -> 11430410 System.Object[] + + -> 1142fc90 System.Lazy`2[[Microsoft.VisualStudio.ProjectSystem.Designers.Properties.IDynamicEnumValuesProvider, +Microsoft.VisualStudio.ProjectSystem.V14Only],[Microsoft.VisualStudio.ProjectSystem.PropertyPages.IDynamicEnumCategoryMetadata, +Microsoft.VisualStudio.ProjectSystem.Implementation]] + + -> 1142fcb4 System.Func`1[[Microsoft.VisualStudio.ProjectSystem.Designers.Properties.IDynamicEnumValuesProvider, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + + -> 1142fca8 +Microsoft.VisualStudio.Composition.DelegateServices+<>c__DisplayClass0`1[[Microsoft.VisualStudio.ProjectSystem.Designers.Properties.IDynamicEnumValuesProvider, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + + -> 1142fc60 System.Func`1[[System.Object, mscorlib]] + + -> 1142fc48 Microsoft.VisualStudio.Composition.RuntimeExportProviderFactory+RuntimeExportProvider+<>c__DisplayClass13 + + -> 11428a68 +Microsoft.VisualStudio.Composition.RuntimeExportProviderFactory+RuntimeExportProvider+RuntimePartLifecycleTracker + + -> 11428aa8 +System.Collections.Generic.HashSet`1[[Microsoft.VisualStudio.Composition.ExportProvider+PartLifecycleTracker, +Microsoft.VisualStudio.Composition]] + + -> 1142fa10 +System.Collections.Generic.HashSet`1+Slot[[Microsoft.VisualStudio.Composition.ExportProvider+PartLifecycleTracker, +Microsoft.VisualStudio.Composition]][] + + -> 1142bc18 +Microsoft.VisualStudio.Composition.RuntimeExportProviderFactory+RuntimeExportProvider+RuntimePartLifecycleTracker + + -> 1142bc80 Microsoft.VisualStudio.ProjectSystem.Items.ProjectItemSchemaManager + + -> 11bc6f20 +System.ComponentModel.Composition.ExportLifetimeContext`1[[System.Threading.Tasks.Dataflow.BroadcastBlock`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Items.IProjectItemSchema, +Microsoft.VisualStudio.ProjectSystem.V14Only]], Microsoft.VisualStudio.ProjectSystem.V14Only]], +System.Threading.Tasks.Dataflow]] + + -> 11bc6f00 System.Action + + -> 11bc6100 +Microsoft.VisualStudio.ProjectSystem.Utilities.DataflowExtensions+<>c__DisplayClass12`2[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], +Microsoft.VisualStudio.ProjectSystem.V14Only],[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Items.IProjectItemSchema, +Microsoft.VisualStudio.ProjectSystem.V14Only]], Microsoft.VisualStudio.ProjectSystem.V14Only]] + + -> 11bc6ee8 System.Threading.Tasks.Dataflow.Internal.Disposables+Disposable`3[[System.Object, +mscorlib],[System.Threading.Tasks.Dataflow.Internal.TargetRegistry`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], Microsoft.VisualStudio.ProjectSystem.V14Only]], +System.Threading.Tasks.Dataflow],[System.Threading.Tasks.Dataflow.ITargetBlock`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], Microsoft.VisualStudio.ProjectSystem.V14Only]], +System.Threading.Tasks.Dataflow]] + + -> 11bc5058 System.Threading.Tasks.TaskCompletionSource`1[[System.Threading.Tasks.Dataflow.Internal.VoidResult, +System.Threading.Tasks.Dataflow]] + + -> 11bc5064 System.Threading.Tasks.Task`1[[System.Threading.Tasks.Dataflow.Internal.VoidResult, +System.Threading.Tasks.Dataflow]] + + -> 11bc51dc System.Threading.Tasks.StandardTaskContinuation + + -> 11bc50dc System.Threading.Tasks.ContinuationTaskFromTask + + -> 11bc4fe4 +System.Threading.Tasks.Dataflow.BroadcastBlock`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], Microsoft.VisualStudio.ProjectSystem.V14Only]] + + -> 11bc4ff8 +System.Threading.Tasks.Dataflow.BroadcastBlock`1+BroadcastingSourceCore`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], +Microsoft.VisualStudio.ProjectSystem.V14Only],[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], Microsoft.VisualStudio.ProjectSystem.V14Only]] + + -> 11bc5090 +System.Threading.Tasks.Dataflow.Internal.TargetRegistry`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], Microsoft.VisualStudio.ProjectSystem.V14Only]] + + -> 11bc50ac +System.Collections.Generic.Dictionary`2[[System.Threading.Tasks.Dataflow.ITargetBlock`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], Microsoft.VisualStudio.ProjectSystem.V14Only]], +System.Threading.Tasks.Dataflow],[System.Threading.Tasks.Dataflow.Internal.TargetRegistry`1+LinkedTargetInfo[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], Microsoft.VisualStudio.ProjectSystem.V14Only]], +System.Threading.Tasks.Dataflow]] + + -> 11bdadd4 +System.Collections.Generic.Dictionary`2+Entry[[System.Threading.Tasks.Dataflow.ITargetBlock`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], Microsoft.VisualStudio.ProjectSystem.V14Only]], +System.Threading.Tasks.Dataflow],[System.Threading.Tasks.Dataflow.Internal.TargetRegistry`1+LinkedTargetInfo[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], Microsoft.VisualStudio.ProjectSystem.V14Only]], +System.Threading.Tasks.Dataflow]][] + + -> 11bc5290 +System.Threading.Tasks.Dataflow.TransformBlock`2[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], +Microsoft.VisualStudio.ProjectSystem.V14Only],[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + + -> 11bc56c8 +System.Threading.Tasks.Dataflow.Internal.TargetCore`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectVersionedValue`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], Microsoft.VisualStudio.ProjectSystem.V14Only]] + + -> 11bc5800 System.Threading.Tasks.TaskCompletionSource`1[[System.Threading.Tasks.Dataflow.Internal.VoidResult, +System.Threading.Tasks.Dataflow]] + + -> 11bc580c System.Threading.Tasks.Task`1[[System.Threading.Tasks.Dataflow.Internal.VoidResult, +System.Threading.Tasks.Dataflow]] + + -> 11bc5c68 System.Threading.Tasks.StandardTaskContinuation + + -> 11bc5b68 System.Threading.Tasks.ContinuationTaskFromTask + + -> 11bc52b8 +System.Threading.Tasks.Dataflow.Internal.SourceCore`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + + -> 11bc565c +System.Threading.Tasks.Dataflow.Internal.TargetRegistry`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + + -> 11bc5678 +System.Collections.Generic.Dictionary`2[[System.Threading.Tasks.Dataflow.ITargetBlock`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], +System.Threading.Tasks.Dataflow],[System.Threading.Tasks.Dataflow.Internal.TargetRegistry`1+LinkedTargetInfo[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], System.Threading.Tasks.Dataflow]] + + -> 11bc5fec +System.Collections.Generic.Dictionary`2+Entry[[System.Threading.Tasks.Dataflow.ITargetBlock`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], +System.Threading.Tasks.Dataflow],[System.Threading.Tasks.Dataflow.Internal.TargetRegistry`1+LinkedTargetInfo[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], System.Threading.Tasks.Dataflow]][] + + -> 11bc5dac +System.Threading.Tasks.Dataflow.BroadcastBlock`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + + -> 11bc5dc0 +System.Threading.Tasks.Dataflow.BroadcastBlock`1+BroadcastingSourceCore`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only],[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + + -> 11bc5e58 +System.Threading.Tasks.Dataflow.Internal.TargetRegistry`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + + -> 11bc5e74 +System.Collections.Generic.Dictionary`2[[System.Threading.Tasks.Dataflow.ITargetBlock`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], +System.Threading.Tasks.Dataflow],[System.Threading.Tasks.Dataflow.Internal.TargetRegistry`1+LinkedTargetInfo[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], System.Threading.Tasks.Dataflow]] + + -> 11c0e6c8 +System.Collections.Generic.Dictionary`2+Entry[[System.Threading.Tasks.Dataflow.ITargetBlock`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], +System.Threading.Tasks.Dataflow],[System.Threading.Tasks.Dataflow.Internal.TargetRegistry`1+LinkedTargetInfo[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], System.Threading.Tasks.Dataflow]][] + + -> 11c0e194 +System.Threading.Tasks.Dataflow.ActionBlock`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + + -> 11c0e1d4 +System.Threading.Tasks.Dataflow.Internal.TargetCore`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + + -> 11c0e1b4 +System.Action`1[[System.Collections.Generic.KeyValuePair`2[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only],[System.Int64, mscorlib]], +mscorlib]] + + -> 11c0e1a4 +System.Threading.Tasks.Dataflow.ActionBlock`1+<>c__DisplayClass5[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + + -> 11c0e174 System.Action`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + + -> 11c0e0d4 +Microsoft.VisualStudio.ProjectSystem.Utilities.Designers.ProjectDataSources+<>c__DisplayClass2`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]] + + -> 11c0e704 System.Threading.Tasks.Dataflow.Internal.Disposables+Disposable`3[[System.Object, +mscorlib],[System.Threading.Tasks.Dataflow.Internal.TargetRegistry`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], +System.Threading.Tasks.Dataflow],[System.Threading.Tasks.Dataflow.ITargetBlock`1[[Microsoft.VisualStudio.ProjectSystem.Designers.IProjectSnapshot, +Microsoft.VisualStudio.ProjectSystem.V14Only]], System.Threading.Tasks.Dataflow]] + + -> 11bc5e20 System.Threading.Tasks.TaskCompletionSource`1[[System.Threading.Tasks.Dataflow.Internal.VoidResult, +System.Threading.Tasks.Dataflow]] + + -> 11bc5e2c System.Threading.Tasks.Task`1[[System.Threading.Tasks.Dataflow.Internal.VoidResult, +System.Threading.Tasks.Dataflow]] + + -> 11c0e8d4 System.Collections.Generic.List`1[[System.Object, +mscorlib]] + + -> 11c0e8ec System.Object[] + + -> 11c0e81c System.Threading.Tasks.StandardTaskContinuation + + -> 11c0e71c System.Threading.Tasks.ContinuationTaskFromTask + + -> 11c0e7f4 System.Threading.Tasks.Task+ContingentProperties + + -> 11c0e7d0 System.Threading.ExecutionContext + + -> 11c0e748 System.Runtime.Remoting.Messaging.LogicalCallContext + + -> 11c0e76c System.Collections.Hashtable + + -> 11c0e7a0 System.Collections.Hashtable+bucket[] + + -> 11be94a0 +Microsoft.VisualStudio.Threading.AsyncLocal`1+IdentityNode[[Microsoft.VisualStudio.Threading.AsyncReaderWriterLock+Awaiter, +Microsoft.VisualStudio.Threading]] + + -> 11b8cfb0 Microsoft.VisualStudio.Threading.AsyncReaderWriterLock+Awaiter +(dependent handle) + + +Thread 1344: + + 10ebea40 62996a0a Microsoft.VisualStudio.ProjectSystem.ConfiguredProjectCache`1+d__1[[System.__Canon, +mscorlib]].MoveNext() [f:\dd\vsproject\cps\components\implementations\ConfiguredProjectCache.cs +@ 220] + + ebp+a8: 10ebea48 (interior) + + -> 11b8d024 +Microsoft.VisualStudio.ProjectSystem.ConfiguredProjectCache`1+d__1[[System.ComponentModel.ICustomTypeDescriptor, +System]] + + -> 11b8cfb0 Microsoft.VisualStudio.Threading.AsyncReaderWriterLock+Awaiter + + + 10ebeb00 7184a467 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, +System.Threading.ContextCallback, System.Object, Boolean) +[f:\dd\NDP\clr\src\BCL\System\Threading\ExecutionContext.cs @ 825] + + ebp+44: 10ebeb18 + + -> 11c0dcbc System.Threading.ExecutionContext + + -> 11c0dce0 System.Runtime.Remoting.Messaging.LogicalCallContext + + -> 11c0dd04 System.Collections.Hashtable + + -> 11c0dd38 System.Collections.Hashtable+bucket[] + + -> 11be94e8 +Microsoft.VisualStudio.Threading.AsyncLocal`1+IdentityNode[[Microsoft.VisualStudio.Threading.AsyncReaderWriterLock+Awaiter, +Microsoft.VisualStudio.Threading]] + + -> 11be94ac Microsoft.VisualStudio.Threading.AsyncReaderWriterLock+Awaiter +(dependent handle) + + -> 11b8cfb0 Microsoft.VisualStudio.Threading.AsyncReaderWriterLock+Awaiter + + +Found 3 unique roots (run '!GCRoot -all' to see all roots). + + +The gcroot #1 is the one pointed to by an ExecutionContext, so that is +where we can look to find the async state machine that is doing work that +is holding the upgradeable read project lock. + +Gcroot #3 isn't interesting because it's redundant with #2 (rooted by the +same thread). + +What's also interesting here is gcroot #2, in that it's a very short chain +and tells me there is actually a background thread that holds some relevant +code. That suggests this might be a simple deadlock due to a violation of +threading rule #1. Using the "Processes and Threads" window, I translate +thread 1344 to thread #016 and I switch to it to print the callstack. + + + +0:000> ~16s + +eax=00000001 ebx=00000001 ecx=00000000 edx=00000000 esi=00000001 edi=00000001 + +eip=7763aaac esp=10ebe1b8 ebp=10ebe338 iopl=0 nv up ei pl nz na +pe nc + +cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000206 + +ntdll!NtWaitForMultipleObjects+0xc: + +7763aaac c21400 ret 14h + +0:016> k + + # ChildEBP RetAddr + +00 10ebe1b4 75660927 ntdll!NtWaitForMultipleObjects+0xc +[e:\9151.obj.x86fre\minkernel\ntdll\wow6432\objfre\i386\usrstubs.asm @ 825] + +01 10ebe338 748460c0 KERNELBASE!WaitForMultipleObjectsEx+0xcc +[d:\9151\minkernel\kernelbase\synch.c @ 1471] + +02 10ebe388 74845f53 clr!WaitForMultipleObjectsEx_SO_TOLERANT+0x3c +[f:\dd\ndp\clr\src\vm\threads.cpp @ 4892] + +03 (Inline) -------- clr!Thread::DoAppropriateAptStateWait+0x35 +[f:\dd\ndp\clr\src\vm\threads.cpp @ 4926] + +04 10ebe414 74846044 clr!Thread::DoAppropriateWaitWorker+0x237 +[f:\dd\ndp\clr\src\vm\threads.cpp @ 5066] + +05 10ebe480 74846293 clr!Thread::DoAppropriateWait+0x64 +[f:\dd\ndp\clr\src\vm\threads.cpp @ 4733] + +06 10ebe4cc 74832918 clr!CLREventBase::WaitEx+0x128 [f:\dd\ndp\clr\src\vm\synch.cpp +@ 754] + +07 10ebe4e4 748567a7 clr!CLREventBase::Wait+0x1a [f:\dd\ndp\clr\src\vm\synch.cpp +@ 675] + +08 (Inline) -------- clr!Thread::Wait+0x17 [f:\dd\ndp\clr\src\vm\threads.cpp +@ 5551] + +09 10ebe4f8 748568e5 clr!Thread::Block+0x25 [f:\dd\ndp\clr\src\vm\threads.cpp +@ 5508] + +0a 10ebe5a8 748569c6 clr!SyncBlock::Wait+0x18d [f:\dd\ndp\clr\src\vm\syncblk.cpp +@ 3608] + +0b (Inline) -------- clr!ObjHeader::Wait+0x24 [f:\dd\ndp\clr\src\vm\syncblk.cpp +@ 2787] + +0c (Inline) -------- clr!Object::Wait+0x24 [f:\dd\ndp\clr\src\vm\object.h +@ 532] + +0d 10ebe644 717cbbe3 clr!ObjectNative::WaitTimeout+0xcb +[f:\dd\ndp\clr\src\classlibnative\bcltype\objectnative.cpp @ 318] + +0e 10ebe654 7180c9e0 mscorlib_ni!System.Threading.Monitor.Wait(System.Object, +Int32, Boolean)+0x17 [f:\dd\NDP\clr\src\BCL\System\Threading\Monitor.cs +@ 215] + +0f 10ebe6ac 7182ac32 mscorlib_ni!System.Threading.Monitor.Wait(System.Object, +Int32)+0xc [f:\dd\NDP\clr\src\BCL\System\Threading\Monitor.cs @ 225] + +10 10ebe6ac 718233a7 mscorlib_ni!System.Threading.ManualResetEventSlim.Wait(Int32, +System.Threading.CancellationToken)+0x182 +[f:\dd\NDP\clr\src\BCL\System\Threading\ManualResetEventSlim.cs @ 657] + +11 10ebe6ec 71865870 mscorlib_ni!System.Threading.Tasks.Task.SpinThenBlockingWait(Int32, +System.Threading.CancellationToken)+0x93 [f:\dd\NDP\clr\src\BCL\System\Threading\Tasks\Task.cs +@ 3341] + +12 10ebe744 71f60792 mscorlib_ni!System.Threading.Tasks.Task.InternalWait(Int32, +System.Threading.CancellationToken)+0x148 [f:\dd\NDP\clr\src\BCL\System\Threading\Tasks\Task.cs +@ 3282] + +13 10ebe754 629d9c1e +mscorlib_ni!System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task)+0x1e +[f:\dd\NDP\clr\src\BCL\System\Runtime\CompilerServices\TaskAwaiter.cs @ +165] + +14 10ebe768 62f57322 +Microsoft_VisualStudio_ProjectSystem_Implementation_ni!Microsoft.VisualStudio.ProjectSystem.Designers.ProjectSnapshotService.get_ProjectSnapshot()+0x66 +[f:\dd\vsproject\cps\components\implementations\Designers\ProjectSnapshotService.cs +@ 111] + +15 10ebe7d0 62f571f0 +Microsoft_VisualStudio_ProjectSystem_VS_Implementation_ni!Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.SimpleItemNode+d__1.MoveNext()+0x102 +[f:\dd\vsproject\cps\components\VsComponents\Package\Nodes\SimpleItemNode.cs +@ 178] + +16 10ebe824 62f571a6 mscorlib_ni!System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1[[System.__Canon, +mscorlib]].Start[[System.__Canon, mscorlib]](System.__Canon ByRef)+0xf0f605f8 +[f:\dd\NDP\clr\src\BCL\System\Runtime\CompilerServices\AsyncMethodBuilder.cs +@ 459] + +17 10ebe874 62f3242f +Microsoft_VisualStudio_ProjectSystem_VS_Implementation_ni!Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.SimpleItemNode.GetIsMissingItemAsync()+0x3e + +18 10ebe8ac 62f3239b +Microsoft_VisualStudio_ProjectSystem_VS_Implementation_ni!Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.SimpleHierarchyNode+d__1.MoveNext()+0x5f +[f:\dd\vsproject\cps\components\VsComponents\Package\Nodes\SimpleHierarchyNode.cs +@ 66] + +19 10ebe900 62f32351 mscorlib_ni!System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1[[System.__Canon, +mscorlib]].Start[[System.__Canon, mscorlib]](System.__Canon ByRef)+0xf0f3b7a3 +[f:\dd\NDP\clr\src\BCL\System\Runtime\CompilerServices\AsyncMethodBuilder.cs +@ 459] + +1a 10ebe940 0d959b6d +Microsoft_VisualStudio_ProjectSystem_VS_Implementation_ni!Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.SimpleHierarchyNode.CreatePropertiesAsync()+0x49 + +1b 10ebe97c 7182b89d +Microsoft_VisualStudio_ProjectSystem_Implementation_ni!Microsoft.VisualStudio.ProjectSystem.ConfiguredProjectCache`1+<>c__DisplayClass6+<b__8>d__0[[System.__Canon, +mscorlib]].MoveNext()+0xdd [f:\dd\vsproject\cps\components\implementations\ConfiguredProjectCache.cs +@ 296] + +1c 10ebe984 7184a467 mscorlib_ni!System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner.InvokeMoveNext(System.Object)+0x19 +[f:\dd\NDP\clr\src\BCL\System\Runtime\CompilerServices\AsyncMethodBuilder.cs +@ 1090] + +1d 10ebe9e8 7184a3b6 mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, +System.Threading.ContextCallback, System.Object, Boolean)+0xa7 +[f:\dd\NDP\clr\src\BCL\System\Threading\ExecutionContext.cs @ 825] + +1e 10ebe9fc 7182b803 mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, +System.Threading.ContextCallback, System.Object, Boolean)+0x16 +[f:\dd\NDP\clr\src\BCL\System\Threading\ExecutionContext.cs @ 775] + +1f 10ebea34 0d959e4e mscorlib_ni!System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner.Run()+0x5b +[f:\dd\NDP\clr\src\BCL\System\Runtime\CompilerServices\AsyncMethodBuilder.cs +@ 1070] + +20 10ebeaf0 62996a0a +Microsoft_VisualStudio_ProjectSystem_Implementation_ni!Microsoft.VisualStudio.ProjectSystem.ConfiguredProjectCache`1+Awaiter[[System.__Canon, +mscorlib]].Complete()+0x16 [f:\dd\vsproject\cps\components\implementations\ConfiguredProjectCache.cs +@ 390] + +21 10ebeaf0 7182b89d +Microsoft_VisualStudio_ProjectSystem_Implementation_ni!Microsoft.VisualStudio.ProjectSystem.ConfiguredProjectCache`1+d__1[[System.__Canon, +mscorlib]].MoveNext()+0x612 [f:\dd\vsproject\cps\components\implementations\ConfiguredProjectCache.cs +@ 220] + +22 10ebeaf8 7184a467 mscorlib_ni!System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner.InvokeMoveNext(System.Object)+0x19 +[f:\dd\NDP\clr\src\BCL\System\Runtime\CompilerServices\AsyncMethodBuilder.cs +@ 1090] + +23 10ebeb5c 7184a3b6 mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, +System.Threading.ContextCallback, System.Object, Boolean)+0xa7 +[f:\dd\NDP\clr\src\BCL\System\Threading\ExecutionContext.cs @ 825] + +24 10ebeb70 7182b803 mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, +System.Threading.ContextCallback, System.Object, Boolean)+0x16 +[f:\dd\NDP\clr\src\BCL\System\Threading\ExecutionContext.cs @ 775] + +25 10ebeba8 7182b7a7 mscorlib_ni!System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner.Run()+0x5b +[f:\dd\NDP\clr\src\BCL\System\Runtime\CompilerServices\AsyncMethodBuilder.cs +@ 1070] + +26 10ebebfc 6d50f6e1 mscorlib_ni!System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation.<.cctor>b__6(System.Object)+0x2b +[f:\dd\NDP\clr\src\BCL\System\Threading\Tasks\TaskContinuation.cs @ 491] + +27 10ebebfc 6d50f5cc +Microsoft_VisualStudio_Threading_ni!Microsoft.VisualStudio.Threading.AsyncReaderWriterLock+NonConcurrentSynchronizationContext+d__1.MoveNext()+0xe1 +[f:\dd\vsproject\cps\Microsoft.VisualStudio.Threading\Microsoft.VisualStudio.Threading\AsyncReaderWriterLock.cs +@ 1874] + +28 10ebec50 6d50f588 mscorlib_ni!System.Runtime.CompilerServices.AsyncVoidMethodBuilder.Start[[System.__Canon, +mscorlib]](System.__Canon ByRef)+0xfb518dfc +[f:\dd\NDP\clr\src\BCL\System\Runtime\CompilerServices\AsyncMethodBuilder.cs +@ 72] + +29 10ebec9c 6d50f533 +Microsoft_VisualStudio_Threading_ni!Microsoft.VisualStudio.Threading.AsyncReaderWriterLock+NonConcurrentSynchronizationContext.PostHelper(System.Threading.SendOrPostCallback, +System.Object)+0x48 + +2a 10ebed14 717ef226 +Microsoft_VisualStudio_Threading_ni!Microsoft.VisualStudio.Threading.AsyncReaderWriterLock+NonConcurrentSynchronizationContext.b__0(System.Object)+0x33 +[f:\dd\vsproject\cps\Microsoft.VisualStudio.Threading\Microsoft.VisualStudio.Threading\AsyncReaderWriterLock.cs +@ 1832] + +2b 10ebed14 7184a467 mscorlib_ni!System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(System.Object)+0x42 +[f:\dd\NDP\clr\src\BCL\System\Threading\ThreadPool.cs @ 1274] + +2c 10ebed14 7184a3b6 mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, +System.Threading.ContextCallback, System.Object, Boolean)+0xa7 +[f:\dd\NDP\clr\src\BCL\System\Threading\ExecutionContext.cs @ 825] + +2d 10ebed28 71810470 mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, +System.Threading.ContextCallback, System.Object, Boolean)+0x16 +[f:\dd\NDP\clr\src\BCL\System\Threading\ExecutionContext.cs @ 775] + +2e 10ebed44 7180fc6b mscorlib_ni!System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()+0x60 +[f:\dd\NDP\clr\src\BCL\System\Threading\ThreadPool.cs @ 1252] + +2f 10ebed94 7180fb1a mscorlib_ni!System.Threading.ThreadPoolWorkQueue.Dispatch()+0x14b +[f:\dd\NDP\clr\src\BCL\System\Threading\ThreadPool.cs @ 820] + +30 10ebeda4 748313b6 mscorlib_ni!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()+0xa +[f:\dd\NDP\clr\src\BCL\System\Threading\ThreadPool.cs @ 1161] + +31 10ebeda4 74846970 clr!CallDescrWorkerInternal+0x34 +[f:\dd\ndp\clr\src\vm\i386\asmhelpers.asm @ 732] + +32 10ebedf8 74847f65 clr!CallDescrWorkerWithHandler+0x6b +[f:\dd\ndp\clr\src\vm\callhelpers.cpp @ 91] + +33 10ebee6c 7491b094 clr!MethodDescCallSite::CallTargetWorker+0x152 +[f:\dd\ndp\clr\src\vm\callhelpers.cpp @ 649] + +34 (Inline) -------- clr!MethodDescCallSite::Call_RetBool+0xb +[f:\dd\ndp\clr\src\vm\callhelpers.h @ 423] + +35 10ebeeec 74847fb5 clr!QueueUserWorkItemManagedCallback+0x23 +[f:\dd\ndp\clr\src\vm\comthreadpool.cpp @ 513] + +36 10ebef04 74848023 clr!ManagedThreadBase_DispatchInner+0x67 +[f:\dd\ndp\clr\src\vm\threads.cpp @ 18093] + +37 10ebefa8 748480f0 clr!ManagedThreadBase_DispatchMiddle+0x82 +[f:\dd\ndp\clr\src\vm\threads.cpp @ 18143] + +38 10ebf004 7484815f clr!ManagedThreadBase_DispatchOuter+0x5b +[f:\dd\ndp\clr\src\vm\threads.cpp @ 18397] + +39 10ebf028 7491b028 clr!ManagedThreadBase_FullTransitionWithAD+0x2f +[f:\dd\ndp\clr\src\vm\threads.cpp @ 18461] + +3a (Inline) -------- clr!ManagedThreadBase::ThreadPool+0x10 +[f:\dd\ndp\clr\src\vm\threads.cpp @ 18502] + +3b 10ebf0d8 7491ce3f clr!ManagedPerAppDomainTPCount::DispatchWorkItem+0xc4 +[f:\dd\ndp\clr\src\vm\threadpoolrequest.cpp @ 760] + +3c 10ebf0ec 7491cbd2 clr!ThreadpoolMgr::ExecuteWorkRequest+0x42 +[f:\dd\ndp\clr\src\vm\win32threadpool.cpp @ 1863] + +3d 10ebf154 74846b2c clr!ThreadpoolMgr::WorkerThreadStart+0x36b +[f:\dd\ndp\clr\src\vm\win32threadpool.cpp @ 2330] + +3e 10ebfaf4 757f919f clr!Thread::intermediateThreadProc+0x4d +[f:\dd\ndp\clr\src\vm\threads.cpp @ 3478] + +3f 10ebfb00 77650bbb kernel32!BaseThreadInitThunk+0xe +[d:\blue_gdr\base\win32\client\thread.c @ 72] + +40 10ebfb44 77650b91 ntdll!__RtlUserThreadStart+0x20 [d:\9151\minkernel\ntdll\rtlstrt.c +@ 1024] + +41 10ebfb54 00000000 ntdll!_RtlUserThreadStart+0x1b [d:\9151\minkernel\ntdll\rtlstrt.c +@ 939] + + +Sure enough, we have a call that synchronously blocking piece of code in +ProjectSnapshotService.ProjectSnapshot that isn't using the JoinableTaskFactory. +This is a really bad thing and can lead to deadlocks (perhaps this very +one!). We should fix this. + + +Let's move on to find who actually acquired the project upgradeable +read lock though. From GCRoot#2, which is conveniently short, we see +ConfiguredProjectCache.GetValueSlowAsync is holding it. We learn by code +inspection that this method may take either an upgradeable read or a read +lock. Let's inspect the fields of this object to determine which one it +would have taken to verify. Copied from above, the gcroot is: + + + 10ebea40 62996a0a Microsoft.VisualStudio.ProjectSystem.ConfiguredProjectCache`1+d__1[[System.__Canon, +mscorlib]].MoveNext() [f:\dd\vsproject\cps\components\implementations\ConfiguredProjectCache.cs +@ 220] + + ebp+a8: 10ebea48 (interior) + + -> 11b8d024 +Microsoft.VisualStudio.ProjectSystem.ConfiguredProjectCache`1+d__1[[System.ComponentModel.ICustomTypeDescriptor, +System]] + + -> 11b8cfb0 Microsoft.VisualStudio.Threading.AsyncReaderWriterLock+Awaiter + + + +0:016> !do 11b8d024 + +Name: Microsoft.VisualStudio.ProjectSystem.ConfiguredProjectCache`1+d__1[[System.ComponentModel.ICustomTypeDescriptor, +System]] + +MethodTable: 62a1618c + +EEClass: 628c6310 + +Size: 72(0x48) bytes + +File: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.VisualStudio.ProjectSystem.Implementation\v4.0_14.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.ProjectSystem.Implementation.dll + +Fields: + + MT Field Offset Type VT Attr Value Name + +7188fbb8 40006db 10 System.Int32 1 instance -1 +<>1__state + +718a6778 40006dc 18 ...Canon, mscorlib]] 1 instance 11b8d03c +<>t__builder + +62d3a5d8 40006dd 24 ...ojectLockReleaser 1 instance 11b8d048 +5__1 + +62befc34 40006de 4 ...Canon, mscorlib]] 0 instance 11b8cfa0 +CS$<>8__locals1 + +71896038 40006df 14 System.Boolean 1 instance 0 +isWriteLockHeld + +62a0bd7c 40006e0 8 ...Canon, mscorlib]] 0 instance 11b8cf60 +<>4__this + +6d51c598 40006e1 c ...Canon, mscorlib]] 0 instance 11c0de0c +5__3 + +62d3a658 40006e2 30 ...rojectLockAwaiter 1 instance 11b8d054 +<>u__$awaiter3 + +634e4ec0 40006e3 3c ...Microsoft.Build]] 1 instance 11b8d060 +<>u__$awaiter4 + +718a6818 40006e4 40 ...Canon, mscorlib]] 1 instance 11b8d064 +<>u__$awaiter5 + +0:016> !DumpObj /d 11b8cf60 + +Name: Microsoft.VisualStudio.ProjectSystem.ConfiguredProjectCache`1[[System.ComponentModel.ICustomTypeDescriptor, +System]] + +MethodTable: 62a1f170 + +EEClass: 628c5868 + +Size: 52(0x34) bytes + +File: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.VisualStudio.ProjectSystem.Implementation\v4.0_14.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.ProjectSystem.Implementation.dll + +Fields: + + MT Field Offset Type VT Attr Value Name + +62a0a174 4000041 4 ...ojectCacheFactory 0 instance 11427f7c +factory + +7188e0c8 4000042 8 System.Object 0 instance 11b8cf94 +syncObject + +00000000 4000043 c 0 instance 11b8cf40 +cacheUpdateDelegate + +62d1b24c 4000044 20 System.Int32 1 instance 2 +options + +6d51c598 4000045 10 ...Canon, mscorlib]] 0 instance 11c0de0c cache + +6d51c598 4000046 14 ...Canon, mscorlib]] 0 instance 00000000 +cacheUnderWriteLock + +71892d34 4000047 18 System.IComparable 0 instance 1142620c +projectVersion + +7188fbb8 4000048 24 System.Int32 1 instance 71 +evaluationCounter + +7188fbb8 4000049 28 System.Int32 1 instance -1 +evaluationCounterUnderWriteLock + +714c01c8 400004a 1c ...tring, mscorlib]] 0 instance 00000000 +globalPropertiesAtCacheRefresh + +71896038 400004b 2c System.Boolean 1 instance 0 +explicitlyInvalidated + +71896038 400004c 2d System.Boolean 1 instance 0 +explicitlyInvalidatedUnderWriteLock + + +And we see from code inspection that for ConfiguredProjectCacheOptions, +a value of 2 means ValueFactoryRequiresUpgradeableRead. + +Q.E.D. we have identified the holder of the upgradeable read lock. + diff --git a/Index.md b/Index.md new file mode 100644 index 0000000..37ca982 --- /dev/null +++ b/Index.md @@ -0,0 +1,72 @@ +VS Project System Documentation +=============================== + +Documentation +------------- + +- [Introductory Note to CPS candidate users](Documentation/Introductory_Note_to_CPS_candidate_users.md) +- [Overview](Documentation/Overview.md) + - [CPS Core vs. CPS VS](Documentation/CPS_Core_vs._CPS_VS.md) + - [MEF](Documentation/MEF.md) + - [Scopes](Documentation/Scopes.md) + - [Project Capabilities](Documentation/Project_Capabilities.md) + - [Interfaces defined on IVsProject object](Documentation/Interfaces_defined_on_IVsProject_object.md) + - [Interfaces NOT defined on IVsProject object](Documentation/Interfaces_NOT_defined_on_IVsProject_object.md) + - [The Project Lock](Documentation/The_Project_Lock.md) + - [Project configurations](Documentation/Project_configurations.md) + - [Content/item types](Documentation/Contentitem_types.md) + - [ItemIDs](Documentation/ItemIDs.md) + - [Responsive design](Documentation/Responsive_design.md) +- [Threading model](Documentation/Threading_model.md) + - [3 Threading Rules](Documentation/3_Threading_Rules.md) + - [CookBook](Documentation/CookBook.md) + - [Async hang debugging](Documentation/Async_hang_debugging.md) +- [Clients / Automation](Documentation/Clients_Automation.md) + - [How to detect whether a project is a CPS project](Documentation/How_to_detect_whether_a_project_is_a_CPS_project.md) + - [Finding CPS in a VS project](Documentation/Finding_CPS_in_a_VS_project.md) + - [Obtaining the ProjectService](Documentation/Obtaining_the_ProjectService.md) + - [Obtaining the IProjectLockService](Documentation/Obtaining_the_IProjectLockService.md) + - [Obtaining the IThreadHandling service](Documentation/Obtaining_the_IThreadHandling_service.md) + - [Obtaining the MSBuild.Project from CPS](Documentation/Obtaining_the_MSBuild.Project_from_CPS.md) + - [Query output groups](Documentation/Query_output_groups.md) + - [Subscribe to project data](Documentation/Subscribe_to_project_data.md) + - [Notification for async project load completion](Documentation/Notification_for_async_project_load_completion.md) + - [Sync up shims to latest project model](Documentation/Sync_up_shims_to_latest_project_model.md) + - [Add a source item with specific item type](Documentation/Add_a_source_item_with_specific_item_type.md) +- [Extensibility points](Documentation/Extensibility_points.md) + - [Custom item types](Documentation/Custom_item_types.md) + - [Custom reference types](Documentation/Custom_reference_types.md) + - [Custom Debugger](Documentation/Custom_Debugger.md) + - [Property value editors](Documentation/Property_value_editors.md) + - [How to add a fast up-to-date check?](Documentation/How_to_add_a_fast_uptodate_check.md) + - [IsDocumentInProject extensibility](Documentation/IsDocumentInProject_extensibility.md) + - [Automatic DependentUpon wire-up](Documentation/Automatic_DependentUpon_wireup.md) + - [Special nodes under projects in Solution Explorer](Documentation/Special_nodes_under_projects_in_Solution_Explorer.md) + - [Command handlers](Documentation/Command_handlers.md) + - [IProjectTreeProvider](Documentation/IProjectTreeProvider.md) + - [IProjectTreeModifier](Documentation/IProjectTreeModifier.md) + - [IPublishProvider](Documentation/IPublishProvider.md) + - [IProfilableProjectProvider](Documentation/IProfilableProjectProvider.md) + - [Clipboard](Documentation/Clipboard.md) + - [IValidProjectReferenceChecker](Documentation/IValidProjectReferenceChecker.md) + - [IProjectSourceItemProviderExtension](Documentation/IProjectSourceItemProviderExtension.md) + - [IProjectPropertiesProvider](Documentation/IProjectPropertiesProvider.md) + - [IFileSystemErrorMessageProvider](Documentation/IFileSystemErrorMessageProvider.md) +- [HOWTOs](Documentation/HOWTOs.md) + - [Reference Manager](Documentation/Reference_Manager.md) + - [Hide some of the tabs in the Reference Manager Dialog](Documentation/Hide_some_of_the_tabs_in_the_Reference_Manager_Dialog.md) + - [Blocked - Add custom tabs to the Reference Manager](Documentation/Blocked_Add_custom_tabs_to_the_Reference_Manager.md) + - [Provide custom icons for the Project Type/Item type](Documentation/Provide_custom_icons_for_the_Project_TypeItem_type.md) + - [Appropriately schedule async tasks](Documentation/Appropriately_schedule_async_tasks.md) + - [Block/Defer critical project operations](Documentation/BlockDefer_critical_project_operations.md) + - [Analyze Hangs](Documentation/Analyze_Hangs.md) + - [Who holds a project lock?](Documentation/Who_holds_a_project_lock.md) +- [Early Drafts ](Documentation/Early_Drafts.md) + - [How to create a new CPS-based project type](Documentation/How_to_create_a_new_CPSbased_project_type.md) + - [Introduction to new project from wizard](Documentation/Introduction_to_new_project_from_wizard.md) + - [External customer guidance](Documentation/External_customer_guidance.md) + - [WARNING to folks taking a CPS dependency](Documentation/WARNING_to_folks_taking_a_CPS_dependency.md) + - [Property pages](Documentation/Property_pages.md) + - [New capabilities for item templates](Documentation/New_capabilities_for_item_templates.md) + - [What is CPS?](Documentation/What_is_CPS.md) + - [GetMkDocument returns ">12" style strings](Documentation/GetMkDocument_returns_12_style_strings.md)