Fix crash due to bdb69d57dd (Mono typenames are invalid after dll unloaded)

This commit is contained in:
Wojtek Figat
2022-10-29 18:56:21 +02:00
parent 7535f22b10
commit 6379171fa6
2 changed files with 11 additions and 2 deletions

View File

@@ -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]);

View File

@@ -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: