mono_rs/
lib.rs

1pub mod array;
2pub mod assembly;
3pub mod bindings;
4pub mod class;
5pub mod domain;
6pub mod exception;
7pub mod field;
8pub mod image;
9pub mod method;
10pub mod object;
11pub mod string;
12pub mod thread;
13pub mod value;
14pub mod void;
15
16use std::error::Error;
17pub type MonoResult<T> = Result<T, Box<dyn Error>>;
18
19#[cfg(test)]
20mod tests {
21    use crate::{domain::Domain, method::Arguments, value::Value, MonoResult};
22
23    #[test]
24    fn test() -> MonoResult<()> {
25        println!("Creating Domain");
26        let domain = Domain::new("Default")?;
27
28        println!("Opening Assembly");
29        let assembly = domain.open_assembly("Test.dll")?;
30
31        println!("Getting Image");
32        let image = assembly.get_image()?;
33
34        println!("Getting Class");
35        let class = image.get_class_by_name("TestNS", "TestClass")?;
36
37        println!("Creating Object");
38        let object = class.create_object()?;
39
40        println!("Calling Constructor");
41        object.construct(None)?;
42
43        println!("Getting Field");
44        let field = object.get_field_by_name("TestField")?;
45
46        println!("Getting Field Value");
47        let value_object = field.get_value_object()?;
48        if let Value::Str(value_string) = value_object.try_into()? {
49            println!("FieldValue: {}", value_string);
50        } else {
51            println!("FieldValue is not a string");
52        }
53
54        println!("Getting MethodDesc");
55        let method = object.get_method_by_name("TestClass:getTestField()")?;
56
57        println!("Calling Method");
58        let result_object = method.invoke(Arguments::new())?;
59
60        if let Value::Str(result_string) = result_object.try_into()? {
61            println!("{}", result_string);
62        } else {
63            println!("Result is not a string");
64        }
65
66        Ok(())
67    }
68}