C# Port 30004 (actual_q and/or actual_tcp_pose)

Greetings UR Community,
I am currently developing a solution on C# and I was trying to get data from port 30004 (RTDE), particularly the joint positions in real time. I am not really an expert on C# programming, and after a bit of research I was unable to get this done. If someone could give me a hand I would appreciate.
Best regards,

Hi, a quick and easy way is to use this library. You install it from Nuget. The documentation and examples on Github show you examples with RTDE.

class Rtde
    static void Main(string[] args)
        var robot = new UR();

        var param = new ConnectParameters("");

        // Enable RTDE
        param.Rtde.Enable = true;

        // Exchange data at 500Hz
        param.Rtde.Frequency = 500;

        // Select data you want to write in robot controller
        param.Rtde.InputSetup.Add(RtdeInputData.InputIntRegisters, 0);

        // Select data you want the robot to send
        param.Rtde.OutputSetup.Add(RtdeOutputData.OutputDoubleRegisters, 10);

        // Connect to robot

        // Be notified at 500Hz when data is received
        robot.Rtde.OutputDataReceived += Rtde_OutputDataReceived;


        // Get last received data in cache
        Pose actualTcpPose = robot.Rtde.OutputDataValues.ActualTcpPose;
        int toolOutputVoltage = robot.Rtde.OutputDataValues.ToolOutputVoltage;
        double outputDoubleRegisters10 = robot.Rtde.OutputDataValues.OutputDoubleRegisters.X10;


        // Write input values in robot
        var inputValues = new RtdeInputValues();
        inputValues.StandardAnalogOutput0 = 0.2;
        inputValues.InputIntRegisters.X0 = 12;

        // Disconnect only Dashboard communication

        // Disconnect every interfaces (Primary Interface, Dashboard, RTDE, ...)

    private static void Rtde_OutputDataReceived(object sender, RtdeDataPackageEventArgs e)
        // Get frequency of received message (OutputSetup contains Timestamp by default)
        var realMessageFrequency = e.MeasuredFrequency;

        // Get the value of the data you have selected in the setup 
        Pose actualTcpPose = e.OutputDataValues.ActualTcpPose;
        int toolOutputVoltage = e.OutputDataValues.ToolOutputVoltage;
        double outputDoubleRegisters10 = e.OutputDataValues.OutputDoubleRegisters.X10;

        // Write inputs at 500Hz
        var inputValues = new RtdeInputValues();
        inputValues.StandardAnalogOutput0 = 0.5;
        inputValues.InputIntRegisters.X0 = -10;
        (sender as RtdeClientBase)?.WriteInputs(inputValues);

Thank you very much. I had found UnderAutomation before but I got the impression that it was not free, that is, that I had only a 30 day trial. Be it as it may, thank you for your help
Best regards