1use std::{
2 ffi::{c_void, CString},
3 sync::Arc,
4};
5
6use crate::{
7 assembly::Assembly,
8 bindings::{mono_class_from_name, MonoImage},
9 class::Class,
10 domain::Domain,
11 void::AsRawVoid,
12 MonoResult,
13};
14
15#[derive(Clone, Debug)]
16pub struct Image {
17 pub mono_ptr: *mut MonoImage,
18 pub assembly: Arc<Assembly>,
19 pub domain: Arc<Domain>,
20}
21
22impl Image {
23 pub fn get_class_by_name<T: AsRef<str>>(&self, name_space: T, name: T) -> MonoResult<Class> {
24 let name = CString::new(name.as_ref())?;
25 let name_space = CString::new(name_space.as_ref())?;
26 let mono_ptr =
27 unsafe { mono_class_from_name(self.mono_ptr, name_space.as_ptr(), name.as_ptr()) };
28
29 if mono_ptr.is_null() {
30 return Err("MonoClass Null Error!".into());
31 }
32
33 Ok(Class {
34 mono_ptr,
35 assembly: self.assembly.clone(),
36 domain: self.domain.clone(),
37 image: Arc::new(self.clone()),
38 })
39 }
40}
41
42impl AsRawVoid for Image {
43 fn as_raw_void(self) -> *mut c_void {
44 self.mono_ptr as *mut c_void
45 }
46}