rendering: close renderer override bridge phase 4.4

This commit is contained in:
2026-04-26 02:44:21 +08:00
parent 97f3c3486a
commit cf0b00b0d2
4 changed files with 276 additions and 3 deletions

View File

@@ -2747,6 +2747,20 @@ private:
namespace {
std::string ResolveManagedMonoClassAssemblyName(MonoClass* monoClass) {
if (monoClass == nullptr) {
return {};
}
MonoImage* const image =
mono_class_get_image(monoClass);
return TrimAssemblyName(
SafeString(
image != nullptr
? mono_image_get_name(image)
: nullptr));
}
ManagedComponentTypeInfo ResolveManagedComponentTypeInfo(MonoClass* monoClass) {
ManagedComponentTypeInfo typeInfo;
if (!monoClass) {
@@ -2783,13 +2797,17 @@ ManagedComponentTypeInfo ResolveManagedComponentTypeInfo(MonoClass* monoClass) {
}
MonoScriptRuntime* runtime = GetActiveMonoScriptRuntime();
const std::string assemblyName =
ResolveManagedMonoClassAssemblyName(
monoClass);
if (runtime
&& !assemblyName.empty()
&& runtime->IsClassAvailable(
runtime->GetSettings().appAssemblyName,
assemblyName,
typeInfo.namespaceName,
typeInfo.className)) {
typeInfo.kind = ManagedComponentKind::Script;
typeInfo.assemblyName = runtime->GetSettings().appAssemblyName;
typeInfo.assemblyName = assemblyName;
}
return typeInfo;
@@ -7596,6 +7614,12 @@ bool MonoScriptRuntime::DiscoverScriptClasses() {
}
DiscoverScriptClassesInImage(m_settings.appAssemblyName, m_appImage);
for (const ManagedAssemblyDescriptor& assembly :
m_settings.engineAssemblies) {
DiscoverScriptClassesInImage(
assembly.name,
FindLoadedAssemblyImage(assembly.name));
}
DiscoverRenderPipelineAssetClassesInImage(
m_settings.coreAssemblyName,
m_coreImage);
@@ -8748,11 +8772,14 @@ bool MonoScriptRuntime::TrySetFieldValue(
return false;
}
const std::string componentAssemblyName =
ResolveManagedMonoClassAssemblyName(
fieldMetadata.componentClass);
ScriptComponent* component = FindScriptComponentByUUID(reference.scriptComponentUUID);
if (!component
|| !component->GetGameObject()
|| component->GetGameObject()->GetUUID() != reference.gameObjectUUID
|| component->GetAssemblyName() != m_settings.appAssemblyName
|| component->GetAssemblyName() != componentAssemblyName
|| component->GetNamespaceName() != SafeString(mono_class_get_namespace(fieldMetadata.componentClass))
|| component->GetClassName() != SafeString(mono_class_get_name(fieldMetadata.componentClass))) {
return false;