public void RegisterNewNamedTypeRuntimeTypeHandle(MetadataReader metadataReader, TypeDefinitionHandle typeDefHandle, RuntimeTypeHandle runtimeTypeHandle, IntPtr nonGcStaticFields, IntPtr gcStaticFields) { NamedTypeMetadataDescription description = new NamedTypeMetadataDescription() { MetadataReader = metadataReader, TypeDefinition = typeDefHandle }; TypeLoaderLogger.WriteLine("Register new type with eetype = " + runtimeTypeHandle.ToIntPtr().LowLevelToString() + " nonGcStaticFields " + nonGcStaticFields.LowLevelToString() + " gcStaticFields " + gcStaticFields.LowLevelToString()); NamedTypeLookupResult result = _metadataToRuntimeTypeHandleHashtable.GetOrCreateValue(description); result.VersionNumber = _namedTypeLookupLiveVersion + 1; result.RuntimeTypeHandle = runtimeTypeHandle; result.GcStaticFields = gcStaticFields; result.NonGcStaticFields = nonGcStaticFields; unsafe { result.RuntimeTypeHandleHashcode = (int)runtimeTypeHandle.ToEETypePtr()->HashCode; } NamedTypeLookupResult rthToMetadataResult = _runtimeTypeHandleToMetadataHashtable.AddOrGetExisting(result); if (!Object.ReferenceEquals(rthToMetadataResult, result)) { rthToMetadataResult.TypeDefinition = typeDefHandle; rthToMetadataResult.MetadataReader = metadataReader; rthToMetadataResult.GcStaticFields = gcStaticFields; rthToMetadataResult.NonGcStaticFields = nonGcStaticFields; } }
public void UnregisterNewNamedTypeRuntimeTypeHandle(MetadataReader metadataReader, TypeDefinitionHandle typeDefHandle, RuntimeTypeHandle runtimeTypeHandle) { NamedTypeMetadataDescription description = new NamedTypeMetadataDescription() { MetadataReader = metadataReader, TypeDefinition = typeDefHandle }; NamedTypeLookupResult metadataLookupResult; if (_metadataToRuntimeTypeHandleHashtable.TryGetValue(description, out metadataLookupResult)) { metadataLookupResult.RuntimeTypeHandle = default(RuntimeTypeHandle); metadataLookupResult.VersionNumber = -1; } NamedTypeLookupResult runtimeTypeHandleResult; if (_runtimeTypeHandleToMetadataHashtable.TryGetValue(runtimeTypeHandle, out runtimeTypeHandleResult)) { metadataLookupResult.GcStaticFields = IntPtr.Zero; metadataLookupResult.NonGcStaticFields = IntPtr.Zero; metadataLookupResult.RuntimeTypeHandle = default(RuntimeTypeHandle); } }
/// <summary> /// Return the RuntimeTypeHandle for the named type described in metadata. This is used to implement the Create and Invoke /// apis for types. /// /// Preconditions: /// metadataReader + typeDefHandle - a valid metadata reader + typeDefinitionHandle where "metadataReader" is one /// of the metadata readers returned by ExecutionEnvironment.MetadataReaders. /// /// Note: Although this method has a "bool" return value like the other mapping table accessors, the Project N pay-for-play design /// guarantees that any type enabled for metadata also has a RuntimeTypeHandle underneath. /// </summary> /// <param name="metadataReader">Metadata reader for module containing the type</param> /// <param name="typeDefHandle">TypeDef handle for the type to look up</param> /// <param name="runtimeTypeHandle">Runtime type handle (EEType) for the given type</param> public unsafe bool TryGetNamedTypeForMetadata(MetadataReader metadataReader, TypeDefinitionHandle typeDefHandle, out RuntimeTypeHandle runtimeTypeHandle) { NamedTypeMetadataDescription description = new NamedTypeMetadataDescription() { MetadataReader = metadataReader, TypeDefinition = typeDefHandle }; runtimeTypeHandle = default(RuntimeTypeHandle); NamedTypeLookupResult result = _metadataToRuntimeTypeHandleHashtable.GetOrCreateValue(description); if (result.VersionNumber <= _namedTypeLookupLiveVersion) { runtimeTypeHandle = result.RuntimeTypeHandle; } return(!runtimeTypeHandle.IsNull()); }