Changes in v4.17

Release notes for since version v4.16.0.4

This version of NCrunch introduces changes to the grid protocol. This means that grid
node servers must be updated before they can be used with the new version.

Added support for .NET Framework v4.8.1

Implemented a new NCrunch framework attribute, 'UsesThreadsAttribute'. When specified on a test, fixture or assembly, this attribute will signal to the NCrunch engine that the associated test(s) require a specific number of processing threads to run. When the processing queue picks up the related tasks, it will allocate the required number of threads to them from the available threads on the machine. This allows you to reserve system resources for large tests that might otherwise cause problems with CPU starvation during heavy test runs. This feature also works for grid nodes, and there is a system to allow nodes to reserve resources for large test tasks to prevent these being pushed to the end of the queue when they have a higher priority than other tasks.

Added the Thread Count fields so that they are accessible in the UI for Processing Queue tasks and tests shown in the Tests Window.

Add handling for multi-threaded test tasks in the corner spinner popup window. Tests will multiple threads will have their threads counted towards the total capacity in use. 'Processing Tasks' has been renamed to 'Processing Threads'.

Upgraded the NCrunch Grid Node to .NET Framework v4.8. This means that v4.8 of the .NET Framework must be installed on every grid node from this version onwards.

Implemented an aggressive cleanup system for grid nodes that tracks all processes that exist as part of the node's process tree. When the grid node terminates through the console window being closed or the remote recycling option, a background process is spawned that manages the entire cleanup to make sure that no grid node processes are left behind (including processes specific to .NET, such as VBCSCompiler.exe). This should help to resolve issues with socket ghosting and file locks left behind by recycled grid nodes.

Fixed an issue that could cause grid nodes to pull queued tasks in excess of fast lane restrictions when local processing was disabled and the max number of processing threads on the local machine was non-zero.

Fixed an issue that could cause high-CPU grid nodes to tangle incorrectly with the CPU core affinity of test and build processes, impacting the max capacity of nodes.

Fixed the grid node count of physical and logical cores so that this now shows accurate results on systems with multiple CPUs and high core counts.

Adjusted the logging system on grid nodes so that data is not passed to the log unless it satisfies the configured verbosity level for the server. This should significantly improve the performance of large grid nodes with many task processors.

Fixed an issue where the grid node was not correctly matching stored solution snapshots with solutions passed over from the client when these solutions contained multitargeted projects. This would result in the grid node rebuilding the server-side snapshot every time a client connected, greatly increasing the time taken to synchronise the node with the client on connection.

Adjusted the handling of analyzer project references so that when NCrunch builds projects containing these references, it will also introduce a direct reference to the built assembly through an MSBuild Reference. This should allow analyzer projects to function both as analyzers and normal dependencies.

Fixed an issue where a system with long file paths enabled would cause NCrunch to fail to report PathTooLongExceptions from versions of .NET that do not support long file paths.

Introduced a speculative fix for a test results processing problem that could cause downstream instability sometimes when tests are aborted through process termination.

Fixed a race condition that could cause the engine to throw obscure errors or leave tasks hanging in situations where task runners immediately terminated as they were started (which can happen if the expected versions of .NET are not installed)

Changed the way errors are captured when NCrunch processes fail to launch, added a fallback to collect some more information.

Fixed an issue where the loading spinner was continuing to run timer events after closing, wasting resources.

Optimised bug report retrieval to improve performance.

Previously, NCrunch would store the full list of a test environment's detected dependencies in the NCrunch.AllAssemblyLocations environment variable where this could be read out by NCrunch.Framework.NCrunchEnvironment.GetAllAssemblyLocations(). Where the list was too large for the environment block, NCrunch would instead store a file pointer in the environment variable which NCrunch.Framework.NCrunchEnvironment would then read from. We have now changed this so that the file pointer is ALWAYS used for the assembly locations, regardless of whether they fit in the environment block or not. This is done to improve stability in situations where downstream logic in test code may further amend the environment block and run out of space.

Restructured the handling of implicit project dependencies. Dependencies of implicit dependencies will now be considered to also be implicit (unless they are explicitly referenced outside of an implicit tree). The new handling should resolve a number of problems including race conditions and improperly redirected references to older workspaces containing stale code.

Added support for wildcard MSBuild imports in user project files