Subscribing to Events in a .NET Framework Type

With .NET Framework interoperability in Dynamics 365 Business Central objects, you can configure a DotNet variable to subscribe to events that are published by a .NET Framework type. Events are handled by triggers in the AL code of the Business Central object.

You start by declaring in AL the usage of two .NET types from the System assembly. The first type is System.Timers.Timer and it will be used to generate .NET events. The second one is called System.Timers.ElapsedEventArgs and it is required for creating a subscriber to the Elapsed event emitted by the Timer type.

dotnet
{
    assembly(System)
    {
        type(System.Timers.Timer; MyTimer) {}
        type(System.Timers.ElapsedEventArgs; MyElapsedEventArgs) {}
    }
}

You can only subscribe to events that are emitted by global variables of the .NET type marked with the WithEvents attribute. For all the global variables that are marked with this attribute, the compiler will expose the events available on the type as triggers on the variable. The syntax for declaring these triggers is {VariableName}::{EventName}(...ParameterList), but IntelliSense will offer suggestions for the event name and autocomplete the parameter list.

pageextension 50101 CustomerListExt extends "Customer List"
{
    var 
        [WithEvents]
        timer: DotNet MyTimer;
    
    trigger OnOpenPage()
    begin
        SetupTimer();
    end;

    procedure SetupTimer()
    begin 
        timer := timer.Timer(2000);
        timer.AutoReset := true;
        timer.Enabled := true; 
        timer.Start();
    end;

    trigger timer::Elapsed(sender: Variant; e: DotNet MyElapsedEventArgs)
    begin
     // Print a message when this event is published 
        Message('%1', e.SignalTime());
        timer.Stop();
    end;
}

Getting started with Microsoft .NET Interoperability from AL
Migrating from .NET Framework to .NET Standard .NET Control Add-Ins
Serializing .NET Framework Types
Method Attributes
AL Language Extension Configuration