wrapped_mono 0.2.0

`wrapped_mono` is a safe, lightweight wrapper around the mono library. It allows embedding of the mono runtime inside a rust project. Inside this embedded runtime code written in languages supporting the .NET framework, such as C# and F#, can be run. This allows usage of libraries written in those languages, and using them as a scripting language. The mono runtime is used by many game engines, and this wrapper allows using it with projects written in Rust too.
Documentation
#![cfg(test)]
use rusty_fork::rusty_fork_test;
use crate as wrapped_mono;
rusty_fork_test!{
    #[test]
    fn test_interface_iteration(){
        use wrapped_mono::*;
        let domain = jit::init("main",None);
        let asm = domain.assembly_open("test/dlls/Test.dll").expect("Could not load assembly");
        let img = asm.get_image();
        let test_class = Class::from_name(&img,"","TestFunctions").expect("Could not find class");
        let ifaces = test_class.get_interfaces();
        println!("{}",&test_class.get_name());
        assert!(ifaces.len() > 0);
        assert!("IInterfaceOne" == &ifaces[0].get_name());
    }
    #[test]
    fn class_get_namespace(){
        use crate as wrapped_mono;
        use wrapped_mono::jit;
        use wrapped_mono::object::*;
        use wrapped_mono::class::Class;
        let _main = jit::init("main",None);
        let class = Class::get_int_64();
        assert!("System" == &class.get_namespace());
    }
    #[test]
    fn get_parrent(){
        use wrapped_mono::*;
        let domain = jit::init("main",None);
        let asm = domain.assembly_open("test/dlls/Test.dll").expect("Could not load assembly");
        let img = asm.get_image();
        let test_class = Class::from_name(&img,"","TestFunctions").expect("Could not find class");
        test_class.get_parent();
    }
    #[test]
    fn class_get_namespace_no_namespace(){
        use wrapped_mono::*;
        let domain = jit::init("main",None);
        let asm = domain.assembly_open("test/dlls/Test.dll").expect("Could not load assembly");
        let img = asm.get_image();
        let test_class = Class::from_name(&img,"","TestFunctions").expect("Could not find class");
        assert!("" == &test_class.get_namespace());
    }
    #[test]
    fn class_get_array_element_class(){
        use wrapped_mono::*;
        let domain = jit::init("main",None);
        let arr:Array<1,i64> = Array::new(&domain,&[32]);
        let arr_class = arr.get_class();
        assert!(Class::get_int_64() == arr_class.get_element_class());
    }
    #[test]
    fn class_get_rank(){
        use wrapped_mono::*;
        let domain = jit::init("main",None);
        let arr:Array<1,i64> = Array::new(&domain,&[32]);
        let arr_class = arr.get_class();
        let rank = arr_class.get_rank();
        assert!(rank == 1);
    }
    #[test]
    fn class_get_rank_not_array(){
        use wrapped_mono::*;
        let _domain = jit::init("main",None);
        let rank = Class::get_int_64().get_rank();
        assert!(rank == 0);
    }
    #[test]
    fn class_get_field(){
        use crate::binds::MonoObject;
        use wrapped_mono::{jit,class::Class,object::{Object,ObjectTrait}};
        let dom = jit::init("root",None);
        let asm = dom.assembly_open("test/dlls/Test.dll").unwrap();
        let img = asm.get_image();
        let class = Class::from_name(&img,"","TestFunctions").expect("Could not get class");
        let filed = Class::get_field_from_name(&class,"someField").expect("Could not get filed!");
    }
    // TODO:rethink removal of those functionalities, maybe re-add themin 0.3
    /*
    #[test]
    fn ctors_get(){
        use crate::binds::MonoObject;
        use wrapped_mono::{jit,class::Class,object::{Object,ObjectTrait}};
        let dom = jit::init("root",None);
        let asm = dom.assembly_open("test/dlls/Test.dll").unwrap();
        let img = asm.get_image();
        let class = Class::from_name(&img,"","TestFunctions").expect("Could not get class");
        unimplemented!("TODO:fix Class::get_ctors_recursive");
        //let ctors = class.get_ctros_recursive();
        //println!("{}",ctors.len());
        //assert!(ctors.len() == 2);//One of 'Object', one of 'TestFunctions'
    }
    #[test]
    fn ctors_recursive_get(){
        use crate::binds::MonoObject;
        use wrapped_mono::{jit,class::Class,object::{Object,ObjectTrait}};
        let dom = jit::init("root",None);
        let asm = dom.assembly_open("test/dlls/Test.dll").unwrap();
        let img = asm.get_image();
        let class = Class::from_name(&img,"","CtorTestClass").expect("Could not get class");
        unimplemented!("TODO:fix Class::get_ctors_recursive");
        /*
        let ctors = class.get_ctros_recursive();
        println!("Found {} constructors!",ctors.len());
        for ctor in &ctors{
            println!("{}",ctor);
        }
        assert!(ctors.len() == 5);
        */
        //panic!();
    }*/
    #[test]
    fn get_delegate(){
        use wrapped_mono::{jit,class::Class,object::{Object,ObjectTrait}};
        let dom = jit::init("root",None);
        let del = Class::get_delegate_class();
    }
    #[test]
    fn get_generic_class_string(){
        use crate::{Method,Class,MethodTrait};
        let dom = crate::jit::init("root",None);
        let asm = dom.assembly_open("test/dlls/Test.dll").unwrap();
        let img = asm.get_image();
        let class = Class::from_name(&img,"","TestFunctions").expect("Could not get class");
        let met:Method<()> = Method::get_from_name(&class,"CreateTypeString",0).unwrap();
        let res = met.invoke(None,()).expect("Got an exception").unwrap();
    }
         
}