/// <summary> /// Finds McgStructMarshalData for a struct if it is defined in this module /// </summary> /// <param name="structTypeHandle">TypeHandle for the safe struct</param> /// <param name="structMarshalData">McgStructMarshalData for the struct</param> /// <returns>True if the struct marshal data is available in this module</returns> internal bool TryGetStructMarshalData(RuntimeTypeHandle structTypeHandle, out McgStructMarshalData structMarshalData) { structMarshalData = default(McgStructMarshalData); if (m_structMarshalData == null) { return(false); } for (int i = 0; i < m_structMarshalData.Length; i++) { if (structTypeHandle.Equals(m_structMarshalData[i].SafeStructType)) { if (m_structMarshalData[i].HasInvalidLayout) { throw new ArgumentException(SR.Format(SR.Argument_MustHaveLayoutOrBeBlittable, structTypeHandle.GetDisplayName())); } structMarshalData = m_structMarshalData[i]; return(true); } } return(false); }
/// <summary> /// Try to get offset data according to McgStructMarshalData's FieldOffsetStartIndex/NumOfFields /// </summary> /// <param name="structMarshalData">The Struct Marshal Data</param> /// <param name="fieldName">Name of field</param> /// <param name="offset">offset in bytes</param> /// <returns>if the offset value exists, return true; else return false </returns> internal bool TryGetStructFieldOffset(McgStructMarshalData structMarshalData, string fieldName, out uint offset) { // Try to find its field in map if (m_unsafeStructFieldNameMap != null) { int start = structMarshalData.FieldOffsetStartIndex; int count = structMarshalData.NumOfFields; for (int i = start; i < start + count; i++) { if (fieldName == m_unsafeStructFieldNameMap.GetString(i)) { offset = m_unsafeStructOffsetData[i].Offset; return(true); } } } // Couldn't find its field offset = 0; return(false); }
internal static bool TryGetStructMarshalData(RuntimeTypeHandle structureTypeHandle, out McgStructMarshalData structMarshalData) { for (int i = 0; i < s_moduleCount; i++) { if (s_modules[i].TryGetStructMarshalData(structureTypeHandle, out structMarshalData)) { return(true); } } structMarshalData = default(McgStructMarshalData); return(false); }