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

0000002699     -      16-09-2025

Let op: de introductie op deze pagina is niet van toepassing op de Core-versie van Mercator, omdat deze versie standaard C#-code met Roslyn compileert.


Mercator 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_nl

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 is numeriek en heeft de waarde " + i);
            else
                Dialogs.Stop("ox is niet numeriek");
        }
    }
}

 

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)



Functionele cookies: Cookies die nodig zijn voor het gebruik van de website en voorkeurscookies. Ze bevatten geen persoonsgegevens. (Meer informatie)

Analytische cookies: Verzamelen van statistieken met betrekking tot het gedrag van internetgebruikers. (Meer informatie)

Marketingcookies: Om bezoekers op verschillende websites te volgen voor advertentiedoeleinden. (Meer informatie)