== Overview ==

[http://mono-project.org Mono] is a Open Source implementation of the .NET runtime.  The Mono Loader aims to embed mono into libpurple so that plugins can be written in any .NET Language.

== Mono Loader SoC Development Notes ==

=== SoC Goals and Milestones ===
  * Completely wrap libpurple API in .NET bindings.
  * ~~Fix the Mysterious Seg Fault On Exit (tm).~~
  * ~~Re-examing and possibly re-implement signal-glue and API -glue code.~~  The glue code is now gone.  The use of !DllImport has made it all pretty much obsolete.
  * ~~Give .NET Purple objects the ability to actually update their C counterpart (or create one).~~
  * Would be nice if we could explicitly state what Delegates expect, e.g. {{{ OnBuddyStatusChanged(Buddy b, Status s) }}}  This could probably be solved with the Manager idea discussed below.
  * Possibly utilize an object cache in the api, and to manage the mappings between .net objects and their c struct counterparts so we're not constantly (re)building objects.
  * [http://reaperworld.com/htdocs/monoloader.html grim provided gameplan]

=== Mentor Goals/Objectives ([http://guifications.org/trac/wiki/grim grim]) ===
 * Implement signal chaining in Mono so Pidgin's signal handling doesn't get eaten up by the Mono runtime.  See [http://bugzilla.ximian.com/show_bug.cgi?id=75990 Mono Bug 75990].
 * Fix the build system so that make can be run successfully with multiple jobs.

== Loader Internals ==
   The api objects now directly tap into libpurple using !DllImport.  This is true for purple_signal_connect also, which gives us a cleaner way to tie up signals in .Net.  Going to need to explore an Object Manager so that plugins don't have to worry about !IntPtrs and what not.