U bevindt zich nu op een technische pagina over de software Mercator. Deze pagina bevat specifieke informatie die bestemd is voor professionals van de software Mercator. Wenst u naar algemenere informatie over Mercator door te gaan?


   Deze vraag niet meer stellen

Hoe Csharp 6.0 of hoger compileren in de Mercator code-editor?

0000002699     -      24-03-2017

Mercator 10.0 laat ons toe om te compileren in real-time, met inbegrip van de code-editor. Standaard gebruikt Mercator de ressources van System.CodeDom.Compiler, die rusten op de CSC.exe compilator die ingebouwd zit in het .NET-framework. Deze compiler is beperkt tot C# versie 5.0.

Om de syntax te gebruiken met notaties die ondersteund worden in de nieuwe en toekomstige C#-versies, moeten we aanduiden dat Mercator de Roslyn-compiler, officieel gedoopt tot het .NET Compiler Platform". Deze compiler die volledig in .NET geschreven is, is niet meer afhankelijk van een andere executable.

De versie van de huidig geimplementeerde versie in Mercator is Roslyn Roslyn 2.0, waarvan de officiele release simultaan was met de release van Visual Studio 2017. Het is dus compatibel met C# 7.0.

In de C# code-editor van Mercator, bevat het context menu een optie die ons toelaat om aan te geven dat het compileren door Roslyn uitgevoerd moet worden. Deze optie zal een regel toevoegen aan de code die dit mogelijk maakt.

roslyn

Deze regel bevat het volgende: // <CompileWithRoslyn />

Hieronder vind je enkele voorbeelden van onze nieuwe syntax die Mercator kan compileren in de code-editor. (Deze lijst is absoluut niet uitputtend)

String interpolation 

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;

// <CompileWithRoslyn />

namespace MyNameSpace
{
    public class Class1 : MercatorUi.Interfaces.IExec
    {
        public void Main()
        {
            string personne = "Jules";
            DateTime naissance = new DateTime(1985, 2, 10);
            Dialogs.Stop($"{personne} a {Math.Truncate(DateTime.Now.Subtract(naissance).TotalDays / 365)} jaar.");
        }
    }
}

 

Null-Conditional Operator

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;

// <CompileWithRoslyn />

namespace MyNameSpace
{
    public class Class1 : MercatorUi.Interfaces.IExec
    {
        public void Main()
        {
            object ox = null;
            string s = ox?.ToString() ?? "null";
            Dialogs.Stop(s);
        }
    }
}

 

Class properties

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;

// <CompileWithRoslyn />

namespace MyNameSpace
{
    public class Class1 : MercatorUi.Interfaces.IExec
    {
        public class Person
        {
            public string First { get; set; } = "Jules";
            public string Last { get; set; } = "Dupont";
            public string Name => First + " " + Last;
        }

        public void Main()
        {
            Person p = new Person();
            Dialogs.Stop(p.Name);
        }
    }
}

 

Dictionary initializer

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;

// <CompileWithRoslyn />

namespace MyNameSpace
{
    public class Class1 : MercatorUi.Interfaces.IExec
    {
        public void Main()
        {
            var numbers = new Dictionary<int, string> { [7] = "zeven", [9] = "negen", [13] = "dertien" };
        }
    }
}

 

Out with type

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;
using System.Globalization;

// <CompileWithRoslyn />

namespace MyNameSpace
{
    public class Class1 : MercatorUi.Interfaces.IExec
    {
        public void Main()
        {
            string s = "2017-03-07";
            if (DateTime.TryParseExact(s, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime realaseDate))
                Dialogs.Stop("Visual Studio 2017 release datum = " + realaseDate.ToShortDateString());
            else
                Dialogs.Stop("Foutieve datum!");
        }
    }
}

 

Is-expressions with patterns

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;

// <CompileWithRoslyn />

namespace MyNameSpace
{
    public class Class1 : MercatorUi.Interfaces.IExec
    {
        public void Main()
        {
            object ox = "1";
            if ((ox is int i) || ((ox is string s && int.TryParse(s, out i))))
                Dialogs.Stop("ox est numérique et vaut " + i);
            else
                Dialogs.Stop("ox n'est pas numérique");
        }
    }
}

 

Result as ValueTuple

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;

// <CompileWithRoslyn />

namespace MyNameSpace
{
    public class Class1 : MercatorUi.Interfaces.IExec
    {
        public void Main()
        {
            var premierClient = getNomAdresse();
            Dialogs.Stop($"De eerste klant is {premierClient.nom.TrimEnd()} en zijn adres is {premierClient.adresse.TrimEnd()}");
        }

        private (string nom, string adresse) getNomAdresse()
        {
            DataSet ds = Api.Zselect(Globals.RepData, "select top 1 c_nom,c_adresse from CLI");
            if (ds?.Tables[0].Rows.Count > 0)
                return (ds.Tables[0].Rows[0]["c_nom"].ToString(), ds.Tables[0].Rows[0]["c_adresse"].ToString());
            else
                return ("?", "?");
        }
    }
}

 

Opmerking : In HTML5-modus compileert Mercator altijd via Roslyn, dit omdat het in sandbox-modus niet mogelijk is om een andere executable op te starten. (de CSC.exe compiler)