Вот подход, который я использовал, это - попытка скопировать со спокойного механизма сигналов/слотов, своего рода Шаблона "наблюдатель". Объекты могут испустить сигналы. Каждый сигнал имеет идентификатор в системе - это составлено идентификатором отправителя + имя объекта, Каждый сигнал может быть связан с получателями, который просто является "вызываемым", Вы используете класс шины, чтобы передать сигналы кому-либо заинтересованному получением их, Когда что-то происходит, Вы "отправляете" сигнал. Ниже и реализация в качестве примера
<?php
class SignalsHandler {
/**
* hash of senders/signals to slots
*
* @var array
*/
private static $connections = array();
/**
* current sender
*
* @var class|object
*/
private static $sender;
/**
* connects an object/signal with a slot
*
* @param class|object $sender
* @param string $signal
* @param callable $slot
*/
public static function connect($sender, $signal, $slot) {
if (is_object($sender)) {
self::$connections[spl_object_hash($sender)][$signal][] = $slot;
}
else {
self::$connections[md5($sender)][$signal][] = $slot;
}
}
/**
* sends a signal, so all connected slots are called
*
* @param class|object $sender
* @param string $signal
* @param array $params
*/
public static function signal($sender, $signal, $params = array()) {
self::$sender = $sender;
if (is_object($sender)) {
if ( ! isset(self::$connections[spl_object_hash($sender)][$signal])) {
return;
}
foreach (self::$connections[spl_object_hash($sender)][$signal] as $slot) {
call_user_func_array($slot, (array)$params);
}
}
else {
if ( ! isset(self::$connections[md5($sender)][$signal])) {
return;
}
foreach (self::$connections[md5($sender)][$signal] as $slot) {
call_user_func_array($slot, (array)$params);
}
}
self::$sender = null;
}
/**
* returns a current signal sender
*
* @return class|object
*/
public static function sender() {
return self::$sender;
}
}
class User {
public function login() {
/**
* try to login
*/
if ( ! $logged ) {
SignalsHandler::signal(this, 'loginFailed', 'login failed - username not valid' );
}
}
}
class App {
public static function onFailedLogin($message) {
print $message;
}
}
$user = new User();
SignalsHandler::connect($user, 'loginFailed', array($Log, 'writeLog'));
SignalsHandler::connect($user, 'loginFailed', array('App', 'onFailedLogin'));
$user->login();
?>
Вы можете использовать отладчик CLR , который является частью установки платформы; и не зависит от VS.
Альтернативой (и более подходящей для вашего вопроса) является MDbg , отладчик командной строки для управляемого кода.
Существуют отладчики командной строки, которые поставляются с Инструменты отладки для Windows , например CDB . Для управляемых приложений вам также понадобится модуль SOS .