9.3.3. Пример Ping-Pong

sdk\c-sharp\ping-pong\ping-pong\Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.IO.Pipes;

using RobotNET.SDK;

#if (DEBUG)
using RobotNET.Factory.Debug;
#else
using RobotNET.Factory.Release;
#endif

namespace PingPong
{
    class Program
    {
        static void Main( string[] args )
        {
            Console.WriteLine( string.Format( "Program started!" ) );

            try
            {
#if (DEBUG)
                using( Factory factory = new Factory( args[0], args[1], "sdk\\c-sharp\\ping-pong\\ping-pong-plugin\\bin\\debug\\ping-pong-plugin.dll", "PingPong.Plugin", 120000, uint.MaxValue ) )
#else
                using( Factory factory = new Factory( args[0], args[1], "sdk\\c-sharp\\ping-pong\\ping-pong-plugin\\bin\\release\\ping-pong-plugin.dll", "PingPong.Plugin", 120000, uint.MaxValue ) )
#endif
                {
                    int i = 0;

                    bool exit = false;
                    while( !exit && !( exit = ( Console.KeyAvailable && Console.ReadKey( true ).Key == ConsoleKey.Escape ) ) )
                    {
                        try
                        {
                            Console.Write( "Ping({0}) ", i );
                            factory.Write( string.Format( "{0}", i ) );
                            string _i = factory.Read();
                            if( int.TryParse( _i, out i ) )
                                Console.Write( "Pong({0}) ", i );
                            System.Threading.Thread.Sleep( 1000 );
                            i++;
                        }
                        catch( ErrorGeneric e1 )
                        {
                            // Перехватываем исключительно ошибки оверлейной сети и удаленного плагина
                            // Возникла какая-то ошибка ядра, но нам это не важно - будем восстанавливать соединение
                            Console.Write( "\n{0}\n", e1 );

                            Console.Write( "\nRestoring ... " );
                            System.Threading.Thread.Sleep( 1000 );

                            try
                            {
                                factory.Restore();
                                Console.WriteLine( "OK" );
                            }
                            catch
                            {
                                Console.WriteLine( "FAIL" );
                            }
                        }
                    }
                    factory.Write( "FIN" );
                }
            }
            catch( Exception e0 )
            {
                Console.WriteLine( e0 );
            }

            Console.WriteLine( string.Format( "Program finished!" ) );
        }
    }
}

sdk\c-sharp\ping-pong\ping-pong-plugin\Plugin.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.ComponentModel;
using System.Diagnostics;

using RobotNET.SDK;
using RobotNET.Factory;

namespace PingPong
{
    public class Plugin : MarshalByRefObject, IPlugin
    {
        public void Worker( object _pipe )
        {
            Console.WriteLine( string.Format( "Plugin started!" ) );

            // Поток должен завершиться, если завершилось выполнение кода или был разрушен пайп
            IPipe pipe = ( IPipe )_pipe;

            int bounce = 0;

            int i;
            string _i = string.Empty;
            while( !( !string.IsNullOrEmpty( _i ) && _i == "FIN" ) )
            {
                try
                {
                    _i = pipe.Read();
                    if( int.TryParse( _i, out i ) )
                    {
                        Console.Write( "Bounce({0}) ", i );
                        pipe.Write( string.Format( "{0}", bounce ) );
                        bounce++;
                    }
                }
                catch( ThreadAbortException )
                {
                    // Перехватываем исключение связанное с принудительным завершением плагина
                    // Это нормальная ситуция, т.к. корневой хост контролирует выполнение данного плагина

                    // Здесь код может сделать какие-либо действия при аварийном завершении
                }
                catch( ErrorGeneric e0 )
                {
                    // Перехватываем исключительно ошибки оверлейной сети

                    // Протоколирование ошибки
                    Console.Write( "\n{0}\n", e0 );

                    // Усыпляем поток
                    Thread.Sleep( 1000 );
                }
                catch( Exception e1 )
                {
                    // Тут предполагается получение ошибок приложения

                    // Протоколирование ошибки
                    Console.WriteLine( "\n{0}\n", e1 );

                    // Отправляем на удаленный узел возникшую ошибку
                    pipe.Error( e1 );

                    // Усыпляем поток
                    Thread.Sleep( 1000 );
                }
            }

            Console.WriteLine( string.Format( "Plugin finished!" ) );
        }
    }
}