public unsafe RuntimeFieldHandle GetRuntimeFieldHandleForComponents(RuntimeTypeHandle declaringTypeHandle, IntPtr fieldName) { string fieldNameStr = GetStringFromMemoryInNativeFormat(fieldName); RuntimeFieldHandleKey key = new RuntimeFieldHandleKey(declaringTypeHandle, fieldNameStr); RuntimeFieldHandle runtimeFieldHandle = default(RuntimeFieldHandle); lock (_runtimeFieldHandles) { if (!_runtimeFieldHandles.TryGetValue(key, out runtimeFieldHandle)) { IntPtr runtimeFieldHandleValue = MemoryHelpers.AllocateMemory(sizeof(DynamicFieldHandleInfo)); if (runtimeFieldHandleValue == IntPtr.Zero) { throw new OutOfMemoryException(); } DynamicFieldHandleInfo *fieldData = (DynamicFieldHandleInfo *)runtimeFieldHandleValue.ToPointer(); fieldData->DeclaringType = *(IntPtr *)&declaringTypeHandle; fieldData->FieldName = fieldName; // Special flag (lowest bit set) in the handle value to indicate it was dynamically allocated runtimeFieldHandleValue = runtimeFieldHandleValue + 1; runtimeFieldHandle = *(RuntimeFieldHandle *)&runtimeFieldHandleValue; _runtimeFieldHandles.Add(key, runtimeFieldHandle); } return(runtimeFieldHandle); } }
public unsafe IntPtr TryGetRuntimeFieldHandleForComponents(RuntimeTypeHandle declaringTypeHandle, IntPtr fieldName) { IntPtr runtimeFieldHandleValue = MemoryHelpers.AllocateMemory(sizeof(DynamicFieldHandleInfo)); DynamicFieldHandleInfo *fieldData = (DynamicFieldHandleInfo *)runtimeFieldHandleValue.ToPointer(); fieldData->DeclaringType = *(IntPtr *)&declaringTypeHandle; fieldData->FieldName = fieldName; // Special flag (lowest bit set) in the handle value to indicate it was dynamically allocated return(runtimeFieldHandleValue + 1); }
public unsafe RuntimeFieldHandle GetRuntimeFieldHandleForComponents(RuntimeTypeHandle declaringTypeHandle, IntPtr fieldName) { IntPtr runtimeFieldHandleValue = MemoryHelpers.AllocateMemory(sizeof(DynamicFieldHandleInfo)); if (runtimeFieldHandleValue == IntPtr.Zero) { throw new OutOfMemoryException(); } DynamicFieldHandleInfo *fieldData = (DynamicFieldHandleInfo *)runtimeFieldHandleValue.ToPointer(); fieldData->DeclaringType = *(IntPtr *)&declaringTypeHandle; fieldData->FieldName = fieldName; // Special flag (lowest bit set) in the handle value to indicate it was dynamically allocated runtimeFieldHandleValue = runtimeFieldHandleValue + 1; return(*(RuntimeFieldHandle *)&runtimeFieldHandleValue); }
private unsafe bool TryGetDynamicRuntimeFieldHandleComponents(RuntimeFieldHandle runtimeFieldHandle, out RuntimeTypeHandle declaringTypeHandle, out string fieldName) { IntPtr runtimeFieldHandleValue = *(IntPtr *)&runtimeFieldHandle; // Special flag in the handle value to indicate it was dynamically allocated Debug.Assert((runtimeFieldHandleValue.ToInt64() & 0x1) == 0x1); runtimeFieldHandleValue = runtimeFieldHandleValue - 1; DynamicFieldHandleInfo *fieldData = (DynamicFieldHandleInfo *)runtimeFieldHandleValue.ToPointer(); declaringTypeHandle = *(RuntimeTypeHandle *)&(fieldData->DeclaringType); // FieldName points to the field name in NativeLayout format, so we parse it using a NativeParser IntPtr fieldNamePtr = fieldData->FieldName; fieldName = GetStringFromMemoryInNativeFormat(fieldNamePtr); return(true); }