static extern void StartApproximation(
     [MarshalAs(UnmanagedType.FunctionPtr)] OnApproximationProgressUpdateCallback onProgressUpdate,
     [MarshalAs(UnmanagedType.FunctionPtr)] OnApproximationFinishedCallback onApproximationFinished,
     [MarshalAs(UnmanagedType.LPStr)] string taskGuid,
     [MarshalAs(UnmanagedType.LPStr)] string datafilePath,
     int populationSize,
     int generationsNumber,
     double crossoverProbability,
     double mutationProbability);
 public void Approximate(
     OnApproximationProgressUpdateCallback onProgressUpdate,
     OnApproximationFinishedCallback onApproximationFinished,
     Guid taskGuid,
     string datafilePath,
     AlgorithmParams algorithmParams)
 {
     StartApproximation(
         onProgressUpdate,
         onApproximationFinished,
         taskGuid.ToString(),
         datafilePath,
         algorithmParams.PopulationSize,
         algorithmParams.GenerationsNumber,
         algorithmParams.CrossoverProbability,
         algorithmParams.MutationProbability);
 }