mta-mono/mono-test/CMono.cpp
Dmitry Korolev 4123ce833b TODO
2014-10-07 21:49:48 +04:00

107 lines
1.8 KiB
C++

#include "stdafx.h"
#include "CMono.h"
CMono::CMono( ) : m_pMonoDomain( NULL )
{
}
CMono::~CMono()
{
if( this->m_pMonoDomain )
{
mono_jit_cleanup( this->m_pMonoDomain );
}
}
bool CMono::Init( const char* szVersion )
{
// #ifdef _WIN32
mono_set_dirs( "./lib", "./etc" );
// #endif
// mono_config_parse( NULL );
mono_debug_init( MONO_DEBUG_FORMAT_MONO );
this->m_pMonoDomain = mono_jit_init_version( "Mono Root", szVersion );
this->AddInternals();
return true;
}
void CMono::AddInternals()
{
mono_add_internal_call( "MonoTest.Vector3::Test", CMono::Test );
}
bool CMono::Load( const char * szFilePath )
{
struct stat buf;
if( stat( szFilePath, &buf ) == -1 )
{
printf( "%s - file not found\n", szFilePath );
return false;
}
CMonoAssembly pAssembly( this->m_pMonoDomain, szFilePath );
if( !pAssembly.IsValid() )
{
return false;
}
CMonoClass* pClass = pAssembly.GetClass( pAssembly.GetImageName(), "Resource" );
if( !pClass )
{
printf( "%s::Resource - not found\n", pAssembly.GetImageName() );
return false;
}
CMonoObject* pMonoObject = pClass->New();
if( !pMonoObject )
{
printf( "failed to create new object of class '%s::Resource'\n", pAssembly.GetImageName() );
return false;
}
return true;
}
void CMono::Test( MonoObject* vector )
{
MonoClass* pClass = mono_object_get_class( vector );
printf( "%s->", mono_class_get_name( pClass ) );
MonoProperty* pX = mono_class_get_property_from_name( pClass, "X" );
if( !pX )
{
printf( "ERROR\n" );
return;
}
printf( "%s = ", mono_property_get_name( pX ) );
MonoObject* value = mono_property_get_value( pX, vector, NULL, NULL );
if( !value )
{
printf( "ERROR\n" );
return;
}
float fX = *(float*)mono_object_unbox( value );
printf( "%f\n", fX );
}