Porting GeneticSharp to .NET Core
The GeneticSharp v2.0.0-rc1 is out.
In this version GeneticSharp starts to support .NET Standard 2.0 and .NET Framework 4.6.2.
Sometime ago I started to porting GeneticSharp to .NET Core and today, after more than 40 hours of work, I finally finish it.
Although GeneticSharp born as a multi-platform library that ran in any OS supported by .NET Framework and Mono, convert it to .NET Core was a desired thing, because .NET Core is where .NET ecosystem is targeting.
This 2.0.0-rc1 was already published to nuget.org, but it’s marked as a pre-realease package. I will kept it as a RC until get sure that there is no issue with the porting and until the Unity3d remove the “experimental” status to its support to .NET Standard 2.0.
If you are in .NET Core or in .NET Framework 4.6.2+ project, please try the the 2.0.0-rc1 version.
install-package GeneticSharp -Version 2.0.0-rc1
GeneticSharp and extensions (TSP, AutoConfig, Bitmap equality, Equality equation, Equation solver, Function builder, etc):
install-package GeneticSharp.Extensions -Version 2.0.0-rc1
If you’re still in a .NET Framework version lower than 4.6.2 project use the 1.2.0 version.
install-package GeneticSharp -Version 1.2.0
To start the porting I followed the good pratices describe on links below:
Based on those reads, I decided to support the .NET Standard 2.0 (netstandard2.0) and the .NET Framework 4.6.2 (net462). This meaning that GeneticSharp can be used in .NET Standard and .NET Framework projects, with no differences.
Another thing that I considered was the Unity3d support, so based on this post Unity 2018.1 - .NET Standard 2.0 and .NET 4.6 support Unity is already using a experimental support to netstandard2.0 and net462 libraries.
The domain part of the library, the GeneticSharp.Domain library was the easy part to port, if I cleary remember there was no change it all, besides the changes on .csproj.
The extensions from GeneticSharp.Extensions project needed some more work, because the System.Drawing do not exists directly in .NET Standard 2.0. That was resolved using the System.Drawing.Common NuGet package.
The NCalc library used on FunctionBuilderFitness was updated to use the NCalc.NetCore version.
One of the most tricky porting was the GeneticSharp.Infrastructure.Threading, because it used the external library SmartThreadPool and that one was not supporting .NET Core at that time. I decided to implement the parallel task executor using the .NET built-in ThreadPool class, this implementation was done on ParallelTaskExecutor and its use can be tested on ParallelTaskExecutorTest.
GeneticSharp sample app (GeneticSharp.Runner.GtkApp) was built using Gtk# 2, but only version 3 was ported to .NET Core, and there are huge breaking changes between these two Gtk# versions, so for a while I’ll keeping the sample app still running only on .NET Framework/Mono.
I hope in a near future we can built a cross-platform sample app, maybe using Xamarin Forms for iOS, Android, macOS and UWP. This would be great, but perform this task during the to .NET Core supporting is far from the scope right now.
The links below are some readings that I did while looking for some GTK# alternatives:
- Building Xamarin.Forms Apps with .NET
- Preview: Bringing macOS to Xamarin.Forms
- Xamarin.Mac - Hello, Mac
As the time I wrote this, there was no unanimity about what is the best cross-platform tool to collect code-coverage in .NET Core. There are some tools, but each one has some pros and cons:
- VS 2017 Code Coverage
Can be easily used on Windows platform directly on VS 2017 or in command line:
dotnet test --collect:"Code Coverage"
altcover Instrumenting coverage tool for .net/.net core and Mono, emitting NCover or OpenCover format output.
MiniCover Minimalist Code Coverage Tool for .NET Core.
- coverlet Cross platform code coverage library for .NET Core.
I guess the most promising tool is the coverlet, but I’ll waiting until the end of GeneticSharp 2.0.0 release candidate period to choose one.
Problems, readings, tricks and hacks
Of course that a porting always come with some problems that will you need to figure out by doing some research and solve them, most of time, using some trick and hacks. These one was some of I’ve done:
.NET SDK 2.0 projects targeting .NET 4.x on Mono
As GeneticSharp need to support .NET Framework 4.6.2, but the msbuild does not know where to looking for the framework assemblies in macOS and Linux, so I found thi .NET SDK issue comment issue comment:
When compiling .NET SDK 2.0 projects targeting .NET 4.x on Mono using ‘dotnet build’ you have to teach MSBuild where the Mono copy of the reference asssemblies is.
This msbuild file GeneticSharp.dotnet-core.targets was created and referenced in all .csproj.
dotnet test “Failed to initialize client proxy”
Sometimes dotnet test gives the error:
Starting test execution, please wait...
Failed to initialize client proxy: could not connect to test process.
Test Run Aborted
Delete the “obj” and “bin” folders from unit test project will “fix” the problem.
- The GeneticSharp NuGet package was split into two packages:
- GeneticSharp: only GeneticSharp.Domain.dll and GeneticSharp.Infrastructure.Framework.dll
- GeneticSharp.Extensions: depends on GenetiSharp.Package and add the GeneticSharp.Extensions.dll.
- SmartThreadPoolTaskExecutor does not exists anymore. You should use ParallelTaskExecutor class (not disposable).
- The projects are not signed anymore:
- In the ConsoleApp the EquationSolverSampleController was removed until the Jace library suportt .NET Core.
Reads during the porting
Some readings I did during the whole process, maybe can be useful to someone porting a library to .NET Core too.
- SmartThreadPool - Adding support to .NET Core 2.0
- How to set
OutputPathattribute in Visual Studio 2017 project ( new .csproj file format ) without target framework cluttering the resolved path?
- How do you multi-target a .NET Core class library with csproj?
- Old csproj to new csproj: Visual Studio 2017 upgrade guide
- A Guide to NSubstitute for Rhino.Mocks Users
- Duplicate ‘System.Reflection.AssemblyCompanyAttribute’ attribute
- NUnit - Support .NET Core 2.0
- Multi-Targeting and Porting a .NET Library to .NET Core 2.0
- Organizing your project to support .NET Framework and .NET Core
- System.Drawing.Bitmap class is claimed to be present in netcoreapp2.0
- .NET Core Image Processing
- Add support for dotnet test –collect:”Code Coverage”
- Building pre-release packages
- dotnet pack with nuspec file does not set PackageVersion from csproj
- Invalid warning “Assembly outside lib folder.” in dotnet pack
- Feature : Allow project reference DLLs to be added to the parent nupkg for pack target like IncludeReferencedProjects in nuget.exe
Now I’m planning to create a GeneticSharp’s sample using Unity3d’s new beta features, like the new ECS (Entity Component System), C# Job System and the Burst compiler.