private void GetDependenciesDueToTemplateTypeLoader(ref DependencyList dependencies, NodeFactory factory, MethodDesc method) { // TODO-SIZE: this is overly generous in the templates we create if (_blockingPolicy is FullyBlockedMetadataBlockingPolicy) { return; } if (method.HasInstantiation) { GenericMethodsTemplateMap.GetTemplateMethodDependencies(ref dependencies, factory, method); } else { TypeDesc owningTemplateType = method.OwningType; // Unboxing and Instantiating stubs use a different type as their template if (factory.TypeSystemContext.IsSpecialUnboxingThunk(method)) { owningTemplateType = factory.TypeSystemContext.GetTargetOfSpecialUnboxingThunk(method).OwningType; } GenericTypesTemplateMap.GetTemplateTypeDependencies(ref dependencies, factory, owningTemplateType); } }
/// <summary> /// This method is an extension point that can provide additional metadata-based dependencies to compiled method bodies. /// </summary> public void GetDependenciesDueToReflectability(ref DependencyList dependencies, NodeFactory factory, MethodDesc method) { MetadataCategory category = GetMetadataCategory(method); if ((category & MetadataCategory.Description) != 0) { GetMetadataDependenciesDueToReflectability(ref dependencies, factory, method); } if ((category & MetadataCategory.RuntimeMapping) != 0) { if (IsReflectionInvokable(method)) { // We're going to generate a mapping table entry for this. Collect dependencies. ReflectionInvokeMapNode.AddDependenciesDueToReflectability(ref dependencies, factory, method); ReflectionInvokeSupportDependencyAlgorithm.GetDependenciesFromParamsArray(ref dependencies, factory, method); } GenericMethodsTemplateMap.GetTemplateMethodDependencies(ref dependencies, factory, method); GenericTypesTemplateMap.GetTemplateTypeDependencies(ref dependencies, factory, method.OwningType); } }