MemberRef CreateInitializeArrayMethod() { if (initializeArrayMethod == null) { var runtimeHelpersType = DotNetUtils.FindOrCreateTypeRef(module, module.CorLibTypes.AssemblyRef, "System.Runtime.CompilerServices", "RuntimeHelpers", false); var systemArrayType = DotNetUtils.FindOrCreateTypeRef(module, module.CorLibTypes.AssemblyRef, "System", "Array", false); var runtimeFieldHandleType = DotNetUtils.FindOrCreateTypeRef(module, module.CorLibTypes.AssemblyRef, "System", "RuntimeFieldHandle", true); var methodSig = MethodSig.CreateStatic(module.CorLibTypes.Void, systemArrayType, runtimeFieldHandleType); initializeArrayMethod = module.UpdateRowId(new MemberRefUser(module, "InitializeArray", methodSig, runtimeHelpersType.TypeDefOrRef)); } return(initializeArrayMethod); }
TypeDef GetArrayType(long size) { CreateOurType(); TypeDef arrayType; if (sizeToArrayType.TryGetValue(size, out arrayType)) { return(arrayType); } if (valueType == null) { valueType = DotNetUtils.FindOrCreateTypeRef(module, module.CorLibTypes.AssemblyRef, "System", "ValueType", false); } arrayType = new TypeDefUser("", string.Format("__StaticArrayInitTypeSize={0}", size), valueType.TypeDefOrRef); module.UpdateRowId(arrayType); arrayType.Attributes = TypeAttributes.NestedPrivate | TypeAttributes.ExplicitLayout | TypeAttributes.Class | TypeAttributes.Sealed | TypeAttributes.AnsiClass; ourType.NestedTypes.Add(arrayType); sizeToArrayType[size] = arrayType; arrayType.ClassLayout = new ClassLayoutUser(1, (uint)size); return(arrayType); }