본문 바로가기

프로그래밍/C,C++

[Mono] Embedding Mono

https://www.mono-project.com/docs/advanced/embedding/

 

Embedding Mono | Mono

Embedding Mono This document describes how to embed the Mono runtime in your application, and how to invoke managed methods from C, and how to invoke C code from managed code. For a general overview of why you would like to embed Mono in your application s

www.mono-project.com

 

 

#include <mono/jit/jit.h>

#include <mono/metadata/assembly.h>

#include <mono/metadata/debug-helpers.h>

#pragma comment(lib, "mono-2.0-sgen.lib")

 

모노 설치폴더의 lib, etc 폴더 위치를 지정한다.

mono_set_dirs("C:\\Program Files\\Mono\\lib", "C:\\Program Files\\Mono\\etc");

 

도메인 초기화

MonoDomain *domain;

domain = mono_jit_init( "myapp" ); 

 

// exe : Main을 포함하고 있는 경우 바로 실행 가능하다.

MonoAssembly *assembly;

assembly = mono_domain_assembly_open( domain, "D:\\Test.exe" );

mono_jit_exec( domain, assembly, argc, argv );

 

 

// dll 은 어셈블리의 image를 가져와서 추가 작업이 필요.

MonoAssembly *assembly;

assembly = mono_domain_assembly_open( domain, "D:\\Test.dll" );

 

MonoImage *image;

image = mono_assembly_get_image( assembly );

 

 


 

static 메쏘드를 호출하는 경우 : 인자, 리턴값 없음

class CSharpClass {

static void Method() { }

}

 

// debug-helpers 사용해 디스크립션 얻기

MonoMethodDesc *methodDesc;

methodDesc = mono_method_desc_new( "CSharpClass:Method()" , NULL);

 

// 디스크립션으로 메쏘드 얻기

MonoMethod *method;

method = mono_method_desc_search_in_image( methodDesc, image );

 

// 메쏘드 호출

// mono_runtime_invoke( MonoMethod *method, void *obj, void **params, MonoObject **exc);

mono_runtime_invoke( method, NULL, NULL, NULL);

 


 

객체의 메쏘드를 호출하는 경우 : 인자, 리턴값 있음

class CSharpClass {

int Method( string name ) { }

}

 

// 클래스를 얻는다

MonoClass *myClass 

myClass = mono_class_from_name( image, "name-space", "CSharpClass" );

 

// 객체 생성 및 생성자 호출

MonoObject *object;

object = mono_object_new( domain, myClass );

mono_runtime_object_init( object );

 

// 디스크립션

MonoMethodDesc *methodDesc;

methodDesc = mono_method_desc_new( "CSharpClass:Method(string)" , NULL);

 

// 디스크립션으로 메쏘드 얻기

MonoMethod *method;

method = mono_method_desc_search_in_image( methodDesc, image );

 

// 리턴, 인자용 데이터

MonoObject *ret;

void *args[1];

args[0] = mono_string_new( domain , "Hello, World");

 

// 메쏘드 호출

ret = mono_runtime_invoke ( method, object, args, NULL );

int value = *(int*)mono_object_unbox(ret);

 

 

 

mono_jit_cleanup(domain);

 

'프로그래밍 > C,C++' 카테고리의 다른 글

[C#] 완전 이진트리 1차원배열  (0) 2018.11.22
MS 프로젝트 파일  (0) 2018.10.02
Boost 라이브러리 빌드  (0) 2018.08.28
[Win API] Console project  (0) 2017.12.06
[C++] 시스템 클럭 밀리세컨드 얻기  (0) 2017.12.06
Kinect sdk 이미지 얻기  (0) 2017.10.26
C# OLEDB 엑셀 읽기  (0) 2016.02.21
[C#] 파일 읽고,쓰기 기초  (0) 2013.09.12
[C#] 이미지 처리 기본 사항들  (0) 2013.09.12
[C#] 이벤트  (0) 2013.09.12