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!" ) );
}
}
}