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
use crate as wrapped_mono;
use rusty_fork::rusty_fork_test;
use wrapped_mono::{jit,class::Class,object::{Object,ObjectTrait},array::Array,method::{Method,MethodTrait}};
rusty_fork_test! {
    #[test]
    fn get_2D_array_from_method(){
        use crate::binds::MonoObject;
        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 mthd:Method<()> = Method::get_from_name(&class,"Get2DIntArray",0).expect("Could not load function");
        let arr:Array<2,i32> = unsafe{Array::from_ptr((
            mthd.invoke(None,()).expect("Exception").expect("got null").get_ptr() as *mut crate::binds::MonoArray
        ))}.expect("got null again");
        assert!(arr.len() == 8*16);
    }
    #[test]
    fn create_4D_array(){
        let dom = jit::init("root",None);
        let arr:Array<4,i32> = Array::new(&dom,&[1,2,3,4]);
        assert!(arr.get_lenghts() == [1,2,3,4]);
        assert!(arr.len() == 1*2*3*4);
        assert!(arr.get_class().get_rank() == 4);
    }
    #[test]
    fn create_1D_array(){
        let dom = jit::init("root",None);
        let arr:Array<1,i32> = Array::new(&dom,&[89]);
        assert!(arr.get_lenghts() == [89]);
        assert!(arr.len() == 89);
        assert!(arr.get_class().get_rank() == 1);
    }
    #[test]
    fn acces_1D_array(){
        let dom = jit::init("root",None);
        let mut arr:Array<1,i32> = Array::new(&dom,&[89]);
        assert!(arr.get_lenghts() == [89]);
        assert!(arr.len() == 89);
        assert!(arr.get_class().get_rank() == 1);
        for i in 0..89{
            arr.set([i],i as i32);
        }
        for i in 0..89{
            assert!(arr.get([i]) == i as i32);
        }
    }
    #[test]
    fn acces_2D_array(){
        let dom = jit::init("root",None);
        let mut arr:Array<2,usize> = Array::new(&dom,&[89,13]);
        assert!(arr.get_lenghts() == [89,13]);
        assert!(arr.len() == 89 * 13);
        assert!(arr.get_class().get_rank() == 2);
        for i in 0..89{
            for j in 0..13{
                arr.set([i,j],i^j);
            }
        }
        for i in 0..89{
            for j in 0..13{
                let a = arr.get([i,j]);
                let b =  i^j;
                assert!(a == b,"{} != {}",a,b);
            }
        }
    }
    #[cfg(not(feature = "unsafe_arrays"))]
    #[test]
    #[should_panic]
    fn outsiede_bound_acces_2D_array(){
        let dom = jit::init("root",None);
        let mut arr:Array<2,usize> = Array::new(&dom,&[89,13]);
        assert!(arr.get_lenghts() == [89,13]);
        assert!(arr.len() == 89 * 13);
        assert!(arr.get_class().get_rank() == 2);
        for i in 0..89{
            for j in 0..14{
                arr.set([i,j],i^j);
            }
        }
        for i in 0..89{
            for j in 0..13{
                let a = arr.get([i,j]);
                let b =  i^j;
                assert!(a == b,"{} != {}",a,b);
            }
        }
    }
}