Fix crash due to bdb69d57dd (Mono typenames are invalid after dll unloaded)
This commit is contained in:
@@ -697,6 +697,7 @@ ManagedBinaryModule::ManagedBinaryModule(MAssembly* assembly)
|
|||||||
// Bind for C# assembly events
|
// Bind for C# assembly events
|
||||||
assembly->Loading.Bind<ManagedBinaryModule, &ManagedBinaryModule::OnLoading>(this);
|
assembly->Loading.Bind<ManagedBinaryModule, &ManagedBinaryModule::OnLoading>(this);
|
||||||
assembly->Loaded.Bind<ManagedBinaryModule, &ManagedBinaryModule::OnLoaded>(this);
|
assembly->Loaded.Bind<ManagedBinaryModule, &ManagedBinaryModule::OnLoaded>(this);
|
||||||
|
assembly->Unloading.Bind<ManagedBinaryModule, &ManagedBinaryModule::OnUnloading>(this);
|
||||||
assembly->Unloaded.Bind<ManagedBinaryModule, &ManagedBinaryModule::OnUnloaded>(this);
|
assembly->Unloaded.Bind<ManagedBinaryModule, &ManagedBinaryModule::OnUnloaded>(this);
|
||||||
|
|
||||||
if (Assembly->IsLoaded())
|
if (Assembly->IsLoaded())
|
||||||
@@ -1095,17 +1096,24 @@ void ManagedBinaryModule::InitType(MClass* mclass)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void ManagedBinaryModule::OnUnloaded(MAssembly* assembly)
|
void ManagedBinaryModule::OnUnloading(MAssembly* assembly)
|
||||||
{
|
{
|
||||||
PROFILE_CPU();
|
PROFILE_CPU();
|
||||||
|
|
||||||
// Clear managed-only types
|
// Clear managed types typenames
|
||||||
for (int32 i = _firstManagedTypeIndex; i < Types.Count(); i++)
|
for (int32 i = _firstManagedTypeIndex; i < Types.Count(); i++)
|
||||||
{
|
{
|
||||||
const ScriptingType& type = Types[i];
|
const ScriptingType& type = Types[i];
|
||||||
const MString typeName(type.Fullname.Get(), type.Fullname.Length());
|
const MString typeName(type.Fullname.Get(), type.Fullname.Length());
|
||||||
TypeNameToTypeIndex.Remove(typeName);
|
TypeNameToTypeIndex.Remove(typeName);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ManagedBinaryModule::OnUnloaded(MAssembly* assembly)
|
||||||
|
{
|
||||||
|
PROFILE_CPU();
|
||||||
|
|
||||||
|
// Clear managed-only types
|
||||||
Types.Resize(_firstManagedTypeIndex);
|
Types.Resize(_firstManagedTypeIndex);
|
||||||
for (int32 i = 0; i < _managedMemoryBlocks.Count(); i++)
|
for (int32 i = 0; i < _managedMemoryBlocks.Count(); i++)
|
||||||
Allocator::Free(_managedMemoryBlocks[i]);
|
Allocator::Free(_managedMemoryBlocks[i]);
|
||||||
|
|||||||
@@ -309,6 +309,7 @@ private:
|
|||||||
void OnLoading(MAssembly* assembly);
|
void OnLoading(MAssembly* assembly);
|
||||||
void OnLoaded(MAssembly* assembly);
|
void OnLoaded(MAssembly* assembly);
|
||||||
void InitType(MClass* mclass);
|
void InitType(MClass* mclass);
|
||||||
|
void OnUnloading(MAssembly* assembly);
|
||||||
void OnUnloaded(MAssembly* assembly);
|
void OnUnloaded(MAssembly* assembly);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|||||||
Reference in New Issue
Block a user