mirror of
https://github.com/ChronosX88/mta-mono.git
synced 2024-11-24 19:22:21 +00:00
Resolved #3 (Изменить точку доступа на Program::Main)
This commit is contained in:
parent
42914cd9e4
commit
457aa93ec4
26
Test/Program.cs
Normal file
26
Test/Program.cs
Normal file
@ -0,0 +1,26 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using MultiTheftAuto;
|
||||
using MultiTheftAuto.EventArgs;
|
||||
|
||||
namespace Test
|
||||
{
|
||||
public class Program
|
||||
{
|
||||
static void Main( string[] args )
|
||||
{
|
||||
Element.Root.OnElementDestroy += Root_ElementDestroy;
|
||||
|
||||
Vehicle vehicle = new Vehicle( VehicleModel.ADMIRAL, Vector3.Zero, Vector3.Zero );
|
||||
|
||||
vehicle.OnElementDestroy += Root_ElementDestroy;
|
||||
|
||||
vehicle.Destroy();
|
||||
}
|
||||
|
||||
public static void Root_ElementDestroy( Element sender, ElementEventArgs e )
|
||||
{
|
||||
Debug.Info( "Root_ElementDestroy {0} {1}", sender.GetType(), e.This.GetType() );
|
||||
}
|
||||
}
|
||||
}
|
@ -63,8 +63,6 @@ CMonoClass::CMonoClass( MonoClass* pMonoClass, CMonoDomain* pDomain )
|
||||
|
||||
CMonoClass::~CMonoClass( void )
|
||||
{
|
||||
this->m_pDomain->ReleaseClass( this );
|
||||
|
||||
this->m_pDomain = nullptr;
|
||||
this->m_pClass = nullptr;
|
||||
|
||||
@ -84,14 +82,16 @@ CMonoClass::~CMonoClass( void )
|
||||
|
||||
this->m_Properties.clear();
|
||||
|
||||
for( auto iter : this->m_Methods )
|
||||
auto iter = this->m_Methods.begin();
|
||||
|
||||
for( ; iter != this->m_Methods.end(); iter++ )
|
||||
{
|
||||
for( auto method : iter.second )
|
||||
for( CMonoMethod* method : iter->second )
|
||||
{
|
||||
delete method;
|
||||
}
|
||||
|
||||
iter.second.clear();
|
||||
iter->second.clear();
|
||||
}
|
||||
|
||||
this->m_Methods.clear();
|
||||
|
@ -12,14 +12,20 @@
|
||||
|
||||
#include "CMonoDomain.h"
|
||||
|
||||
CMonoDomain::CMonoDomain( CMonoInterface* pMono, MonoDomain* pDomain, CResource* pResource )
|
||||
CMonoDomain::CMonoDomain( CMonoInterface* pMono, MonoDomain* pDomain, CResource* pResource, char* szName )
|
||||
{
|
||||
this->m_pMono = pMono;
|
||||
this->m_pDomain = pDomain;
|
||||
this->m_pResource = pResource;
|
||||
|
||||
this->m_strName = szName;
|
||||
|
||||
this->m_pCorlib = nullptr;
|
||||
this->m_pMTALib = nullptr;
|
||||
|
||||
this->m_pMonoAssembly = nullptr;
|
||||
this->m_pMonoImage = nullptr;
|
||||
this->m_pMonoClass = nullptr;
|
||||
}
|
||||
|
||||
CMonoDomain::~CMonoDomain( void )
|
||||
@ -35,6 +41,18 @@ CMonoDomain::~CMonoDomain( void )
|
||||
this->m_ClassPool.clear();
|
||||
|
||||
this->m_pDomain = nullptr;
|
||||
|
||||
this->m_pMonoAssembly = nullptr;
|
||||
this->m_pMonoImage = nullptr;
|
||||
this->m_pMonoClass = nullptr;
|
||||
}
|
||||
|
||||
void CMonoDomain::HandleException( MonoObject* pException )
|
||||
{
|
||||
if( pException )
|
||||
{
|
||||
g_pModuleManager->ErrorPrintf( "%s\n", mono_string_to_utf8( mono_object_to_string( pException, nullptr ) ) );
|
||||
}
|
||||
}
|
||||
|
||||
CMonoClass* CMonoDomain::FindOrAdd( MonoClass* klass )
|
||||
@ -64,20 +82,79 @@ CMonoClass* CMonoDomain::FindOrAdd( MonoClass* klass )
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void CMonoDomain::ReleaseClass( CMonoClass* pClass )
|
||||
{
|
||||
if( !this->m_ClassPool.empty() )
|
||||
{
|
||||
this->m_ClassPool.remove( pClass );
|
||||
}
|
||||
}
|
||||
|
||||
void CMonoDomain::Init( void )
|
||||
{
|
||||
this->m_pCorlib = new CMonoCorlib( this );
|
||||
this->m_pMTALib = new CMonoMTALib( this );
|
||||
}
|
||||
|
||||
bool CMonoDomain::Start( void )
|
||||
{
|
||||
string sDirectory ( CMonoInterface::GetBinariesDirectory() + "/" + this->m_strName + "/" );
|
||||
string sPath ( sDirectory + this->m_strName + ".dll" );
|
||||
string sNamespace ( this->m_strName );
|
||||
string sClass ( "Program" );
|
||||
|
||||
this->m_pMonoAssembly = this->OpenAssembly( sPath.c_str() );
|
||||
|
||||
if( !this->m_pMonoAssembly )
|
||||
{
|
||||
g_pModuleManager->ErrorPrintf( "failed to open assembly '%s.dll'\n", this->m_strName.c_str() );
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
this->GetResource()->RegisterEvents();
|
||||
|
||||
this->m_pMonoImage = mono_assembly_get_image( this->m_pMonoAssembly );
|
||||
|
||||
if( !this->m_pMonoImage )
|
||||
{
|
||||
g_pModuleManager->ErrorPrintf( "failed to get image '%s.dll'\n", this->m_strName.c_str() );
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
this->m_pMonoClass = this->FindOrAdd( mono_class_from_name( this->m_pMonoImage, sNamespace.c_str(), sClass.c_str() ) );
|
||||
|
||||
if( !this->m_pMonoClass )
|
||||
{
|
||||
g_pModuleManager->ErrorPrintf( "class '%s' not found in '%s.dll'\n", sClass.c_str(), this->m_strName.c_str() );
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
CMonoMethod* pMethod = this->m_pMonoClass->GetMethod( "Main", 0 );
|
||||
|
||||
if( !pMethod )
|
||||
{
|
||||
g_pModuleManager->ErrorPrintf( "static method '%s::Main' not found in '%s.dll'\n", sClass.c_str(), this->m_strName.c_str() );
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
MonoString* pString1 = this->NewString( this->m_strName.c_str() );
|
||||
|
||||
MonoArray* pArray = mono_array_new( this->m_pDomain, mono_get_string_class(), 1 );
|
||||
|
||||
mono_array_set( pArray, MonoString*, 0, pString1 );
|
||||
|
||||
void* params[ 1 ];
|
||||
|
||||
params[ 0 ] = pArray;
|
||||
|
||||
MonoObject* pException = nullptr;
|
||||
|
||||
pMethod->Invoke( nullptr, params, pException );
|
||||
|
||||
if( pException )
|
||||
{
|
||||
this->HandleException( pException );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CMonoDomain::Unload( void )
|
||||
{
|
||||
mono_domain_unload( this->m_pDomain );
|
||||
|
@ -30,20 +30,27 @@ private:
|
||||
CResource* m_pResource;
|
||||
CMonoInterface* m_pMono;
|
||||
|
||||
MonoAssembly* m_pMonoAssembly;
|
||||
MonoImage* m_pMonoImage;
|
||||
CMonoClass* m_pMonoClass;
|
||||
|
||||
CMonoCorlib* m_pCorlib;
|
||||
CMonoMTALib* m_pMTALib;
|
||||
|
||||
list< CMonoClass* > m_ClassPool;
|
||||
vector< CMonoClass* > m_ClassPool;
|
||||
|
||||
string m_strName;
|
||||
|
||||
public:
|
||||
CMonoDomain ( CMonoInterface* pMono, MonoDomain* pDomain, CResource* pResource );
|
||||
CMonoDomain ( CMonoInterface* pMono, MonoDomain* pDomain, CResource* pResource, char* szName );
|
||||
~CMonoDomain ( void );
|
||||
|
||||
void HandleException ( MonoObject* pException );
|
||||
|
||||
CMonoClass* FindOrAdd ( MonoClass* klass );
|
||||
void ReleaseClass ( CMonoClass* pClass );
|
||||
|
||||
void Init ( void );
|
||||
|
||||
bool Start ( void );
|
||||
void Unload ( void );
|
||||
bool Set ( bool bForce );
|
||||
MonoAssembly* OpenAssembly ( const char *szName );
|
||||
@ -96,6 +103,8 @@ public:
|
||||
|
||||
CMonoCorlib* GetCorlib ( void ) { return this->m_pCorlib; }
|
||||
CMonoMTALib* GetMTALib ( void ) { return this->m_pMTALib; }
|
||||
|
||||
string GetName ( void ) { return this->m_strName; }
|
||||
};
|
||||
|
||||
#endif
|
@ -43,7 +43,7 @@ CMonoDomain* CMonoInterface::CreateAppdomain( CResource* pResource, char* szName
|
||||
|
||||
if( pMonoDomain )
|
||||
{
|
||||
return new CMonoDomain( this, pMonoDomain, pResource );
|
||||
return new CMonoDomain( this, pMonoDomain, pResource, szName );
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
|
@ -47,10 +47,10 @@ CMonoMTALib::CMonoMTALib( CMonoDomain* pDomain )
|
||||
|
||||
CMonoMTALib::~CMonoMTALib( void )
|
||||
{
|
||||
SAFE_DELETE( this->Color );
|
||||
SAFE_DELETE( this->Vector2 );
|
||||
SAFE_DELETE( this->Vector3 );
|
||||
SAFE_DELETE( this->m_pClass );
|
||||
this->Color = nullptr;
|
||||
this->Vector2 = nullptr;
|
||||
this->Vector3 = nullptr;
|
||||
this->m_pClass = nullptr;
|
||||
|
||||
this->m_pDomain = nullptr;
|
||||
this->m_pAssembly = nullptr;
|
||||
|
@ -24,6 +24,8 @@ CMonoMethod::CMonoMethod( CMonoClass* pClass, MonoMethod* pMethod )
|
||||
|
||||
CMonoMethod::~CMonoMethod( void )
|
||||
{
|
||||
this->m_ArgList.clear();
|
||||
|
||||
this->m_pClass = nullptr;
|
||||
this->m_pMethod = nullptr;
|
||||
}
|
||||
|
@ -18,35 +18,20 @@ CResource::CResource( CMonoInterface* pMono, lua_State *pLuaVM, string sName )
|
||||
this->m_pLuaVM = pLuaVM;
|
||||
this->m_sName = sName;
|
||||
|
||||
this->m_pMonoAssembly = nullptr;
|
||||
this->m_pMonoDomain = nullptr;
|
||||
this->m_pMonoImage = nullptr;
|
||||
this->m_pMonoClass = nullptr;
|
||||
|
||||
this->m_uiGCHandle = 0;
|
||||
}
|
||||
|
||||
CResource::~CResource( void )
|
||||
{
|
||||
this->RemoveEvents();
|
||||
|
||||
if( this->m_uiGCHandle )
|
||||
{
|
||||
mono_gchandle_free( this->m_uiGCHandle );
|
||||
|
||||
this->m_uiGCHandle = 0;
|
||||
}
|
||||
|
||||
this->GetMono()->GetGC()->Collect( this->GetMono()->GetGC()->GetMaxGeneration() );
|
||||
|
||||
mono_domain_set( mono_get_root_domain(), true );
|
||||
|
||||
g_pResourceManager->RemoveFromList( this );
|
||||
|
||||
this->m_pMonoAssembly = nullptr;
|
||||
this->m_pMonoDomain = nullptr;
|
||||
this->m_pMonoImage = nullptr;
|
||||
this->m_pMonoClass = nullptr;
|
||||
SAFE_DELETE( this->m_pMonoDomain );
|
||||
|
||||
this->m_pMono = nullptr;
|
||||
this->m_pLuaVM = nullptr;
|
||||
@ -162,11 +147,6 @@ bool CResource::Init( void )
|
||||
{
|
||||
if( this->m_pLuaVM )
|
||||
{
|
||||
string sDirectory ( CMonoInterface::GetBinariesDirectory() + "/" + this->m_sName + "/" );
|
||||
string sPath ( sDirectory + this->m_sName + ".dll" );
|
||||
string sNamespace ( this->m_sName );
|
||||
string sClass ( "Program" );
|
||||
|
||||
this->m_pMonoDomain = this->GetMono()->CreateAppdomain( this, const_cast< char* >( this->m_sName.c_str() ), nullptr );
|
||||
|
||||
if( !this->m_pMonoDomain )
|
||||
@ -180,25 +160,7 @@ bool CResource::Init( void )
|
||||
|
||||
this->m_pMonoDomain->Init();
|
||||
|
||||
this->m_pMonoAssembly = this->m_pMonoDomain->OpenAssembly( sPath.c_str() );
|
||||
|
||||
if( !this->m_pMonoAssembly )
|
||||
{
|
||||
g_pModuleManager->ErrorPrintf( "failed to open assembly '%s.dll'\n", this->m_sName.c_str() );
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
this->RegisterEvents();
|
||||
|
||||
this->m_pMonoImage = mono_assembly_get_image( this->m_pMonoAssembly );
|
||||
this->m_pMonoClass = mono_class_from_name( this->m_pMonoImage, sNamespace.c_str(), sClass.c_str() );
|
||||
|
||||
MonoObject *pMonoObject = this->m_pMonoDomain->CreateObject( this->m_pMonoClass );
|
||||
|
||||
mono_runtime_object_init( pMonoObject );
|
||||
|
||||
this->m_uiGCHandle = mono_gchandle_new( pMonoObject, true );
|
||||
this->m_pMonoDomain->Start();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -36,12 +36,6 @@ class CResource
|
||||
private:
|
||||
string m_sName;
|
||||
|
||||
MonoAssembly* m_pMonoAssembly;
|
||||
MonoImage* m_pMonoImage;
|
||||
MonoClass* m_pMonoClass;
|
||||
|
||||
uint32_t m_uiGCHandle;
|
||||
|
||||
lua_State* m_pLuaVM;
|
||||
|
||||
CMonoInterface* m_pMono;
|
||||
|
Loading…
Reference in New Issue
Block a user