Changes in v2.17

New Features

Introduced a new NCrunch attribute, 'DistributeByCapabilities'.  When implemented on any assembly, fixture 
or test, this attribute will split the test(s) into clones, with each clone representing a different 
RequiredCapability as passed into the attribute constructor.  This allows NCrunch distributed processing 
to be easily used for multi-platform testing without needing to manually build new tests for each platform 
use case.

Adjusted the status message for grid nodes in the grid management window so that they have a distinct 
state when the engine is offline.

Boosted the memory limit for the x86 engine process from 2GB to 3GB.

Introduced the ability to specify a default license server address for the first-time launch of NCrunch 
on a workspace.  By placing a text file, 'LicenseServerAddress.txt' inside the NCrunch install 
directory and placing the host/address of a known license server in this file, it is possible to have 
the NCrunch client default to using the specified license server.  This should make it easier to push 
out installations of NCrunch automatically on large sites.

License Server: Added the ability to blacklist/whitelist users by Unique ID, Login Name, Machine Name 
and IP Address.  This can be used to control who has access to request tokens from the license server.

License Server: Added a feature to control how the license server identifies a user's Unique ID.  
Normally, the Unique ID is a free text field provided by the client to the server.  When the new feature 
('Override user 'Unique IDs' with user Login Names for licensing') is enabled, the server will disregard 
the client's Unique ID and instead will use the user's Login Name.  This is a useful feature for 
environments where all users are already logged into an active directory, and there are too many users 
to efficiently educate on the way NCrunch uses Unique IDs.

License server: When using the new 'Override user 'Unique IDs' with user Login Names for licensing' 
feature, the license server will prevent NCrunch v2.15 and v2.16 from requesting licenses, as these 
versions do not provide Login Names to the license server.  The license server also won't revoke tokens 
for concurrent use when this feature is enabled.

License server: Added an option on the Statistics page to export all licenses and lease data to CSV 

Fixes and Compatibility Improvements

Added a new test adapter to support NUnit v3.

Updated Xunit to v2.1.

Fixed an issue that was preventing NCrunch from correctly capturing fixture execution times.  This issue 
had a serious impact on engine throughput and responsiveness.

Fixed an issue that was preventing NCrunch from correctly interpreting the results from Xunit2 FsCheck 

Improved the handling of OutOfMemoryExceptions thrown in NCrunch's test environment when trying to process 
test trace output.

Fixed an Xunit V2 integration issue that was preventing Xunit extensions from being loaded into the test 

Fixed an issue that could cause grid connections to get stuck in a data exchange loop after certain changes 
are made to a solution.

Fixed an issue where NCrunch was still queuing tests for projects that had experienced a load error.  This 
was creating downstream instability, including NullReferenceExceptions being thrown on grid nodes.

Improved NCrunch's handling of file locking issues around the upload of files to remote grid servers.  
Previously, the engine would hang indefinitely waiting for the lock to be released.  Now, NCrunch will 
report this as a meaningful error in the Tests Window and will avoid copying the file to the remote server.

Fixed an issue where NCrunch was not correctly handling files encoded without a BOM.

Fixed an issue that could cause a metadata exception when trying to read/instrument some assemblies.

Added a warning for systems using early versions of .NET 4.6 under x64, where a serious GC performance 
issue exists.

Added a warning message for situations where NCrunch detects multiple NUnit tests with the same name 
inside the same project.  NCrunch needs NUnit test names to be unique in order to interpret the results 
of a test run, so this warning should be taken seriously.

Fixed an issue that could cause invalid grid node status values to be shown in the grid management window 
after engine shutdown.

Disabled Roslyn's UseSharedCompilation setting for NCrunch builds.  This setting causes the 
VBCSCompiler.exe process to be spawned during builds, often without effective limits on the lifespan of 
this process.  To prevent grid node servers from being choked out by this process, it will no longer be 
used for NCrunch builds.

Fixed an issue where NCrunch was not writing separators between step output inside XBehave test cases.

Included code analyzer assemblies in NCrunch's auto dependency resolution.

Introduced the automatic detection and resolution of build dependencies in NuGet packages.  NCrunch 
will now attempt to infer the existence of NuGet-related build dependencies through the presence of 
MSBuild Imports pointing into the NuGet packages directory.  Where a NuGet package is referenced with 
a build import, NCrunch will automatically include ALL files in the NuGet package inside the workspace 
for the project.  This should alleviate the need for specifying many NuGet packages using the 
'Additional files to include' setting, though there is a risk that NCrunch may include a number of 
files from NuGet packages that are not actually required in the workspace, thus consuming more disk 
space than otherwise necessary.  This feature is controlled using the new 
'Auto-detect NuGet build dependencies' project-level configuration setting, which defaults to TRUE.

Fixed a PDB custom metadata corruption issue caused by NCrunch's instrumentation.

License server: Fixed a race condition in the license management UI that could cause it to be 
inoperable under certain conditions.

License Server: Fixed poor selection handling in the license management page.

License Server: Fixed an issue that could cause the license data file to be corrupted if the server was 
shut down unexpectedly at an unlucky time.