3 // Copyright (c) Microsoft Corporation. All rights reserved.
6 // <OWNER>Microsoft</OWNER>
7 namespace System.Reflection.Emit
9 using System.Runtime.InteropServices;
11 using System.Security.Permissions;
13 // This class is describing the fieldmarshal.
15 [HostProtection(MayLeakOnAbort = true)]
16 [System.Runtime.InteropServices.ComVisible(true)]
17 [Obsolete("An alternate API is available: Emit the MarshalAs custom attribute instead. http://go.microsoft.com/fwlink/?linkid=14202")]
18 public sealed class UnmanagedMarshal
20 /******************************
21 [System.Runtime.InteropServices.ComVisible(true)]
22 * public static constructors. You can only construct
23 * UnmanagedMarshal using these static constructors.
24 ******************************/
25 public static UnmanagedMarshal DefineUnmanagedMarshal(UnmanagedType unmanagedType)
27 if (unmanagedType == UnmanagedType.ByValTStr ||
28 unmanagedType == UnmanagedType.SafeArray ||
29 unmanagedType == UnmanagedType.CustomMarshaler ||
30 unmanagedType == UnmanagedType.ByValArray ||
31 unmanagedType == UnmanagedType.LPArray)
33 // not a simple native marshal
34 throw new ArgumentException(Environment.GetResourceString("Argument_NotASimpleNativeType"));
36 return new UnmanagedMarshal(unmanagedType, Guid.Empty, 0, (UnmanagedType) 0);
38 public static UnmanagedMarshal DefineByValTStr(int elemCount)
40 return new UnmanagedMarshal(UnmanagedType.ByValTStr, Guid.Empty, elemCount, (UnmanagedType) 0);
43 public static UnmanagedMarshal DefineSafeArray(UnmanagedType elemType)
45 return new UnmanagedMarshal(UnmanagedType.SafeArray, Guid.Empty, 0, elemType);
48 public static UnmanagedMarshal DefineByValArray(int elemCount)
50 return new UnmanagedMarshal(UnmanagedType.ByValArray, Guid.Empty, elemCount, (UnmanagedType) 0);
53 public static UnmanagedMarshal DefineLPArray(UnmanagedType elemType)
55 return new UnmanagedMarshal(UnmanagedType.LPArray, Guid.Empty, 0, elemType);
63 // accessor function for the native type
64 public UnmanagedType GetUnmanagedType
66 get { return m_unmanagedType; }
73 if (m_unmanagedType == UnmanagedType.CustomMarshaler)
76 // throw exception here. There is Guid only if CustomMarshaler
77 throw new ArgumentException(Environment.GetResourceString("Argument_NotACustomMarshaler"));
80 public int ElementCount
84 if (m_unmanagedType != UnmanagedType.ByValArray &&
85 m_unmanagedType != UnmanagedType.ByValTStr)
87 // throw exception here. There is NumElement only if NativeTypeFixedArray
88 throw new ArgumentException(Environment.GetResourceString("Argument_NoUnmanagedElementCount"));
93 public UnmanagedType BaseType
97 if (m_unmanagedType != UnmanagedType.LPArray && m_unmanagedType != UnmanagedType.SafeArray)
99 // throw exception here. There is NestedUnmanagedType only if LPArray or SafeArray
100 throw new ArgumentException(Environment.GetResourceString("Argument_NoNestedMarshal"));
106 private UnmanagedMarshal(UnmanagedType unmanagedType, Guid guid, int numElem, UnmanagedType type)
108 m_unmanagedType = unmanagedType;
114 /************************
118 *************************/
119 internal UnmanagedType m_unmanagedType;
120 internal Guid m_guid;
121 internal int m_numElem;
122 internal UnmanagedType m_baseType;
125 /************************
126 * this function return the byte representation of the marshal info.
127 *************************/
128 internal byte[] InternalGetBytes()
131 if (m_unmanagedType == UnmanagedType.SafeArray || m_unmanagedType == UnmanagedType.LPArray)
134 // syntax for NativeTypeSafeArray is
135 // <SafeArray | LPArray> <base type>
138 buf = new byte[cBuf];
139 buf[0] = (byte) (m_unmanagedType);
140 buf[1] = (byte) (m_baseType);
144 if (m_unmanagedType == UnmanagedType.ByValArray ||
145 m_unmanagedType == UnmanagedType.ByValTStr)
147 // <ByValArray | ByValTStr> <encoded integer>
152 if (m_numElem <= 0x7f)
154 else if (m_numElem <= 0x3FFF)
159 // the total buffer size is the one byte + encoded integer size
161 buf = new byte[cBuf];
164 buf[iBuf++] = (byte) (m_unmanagedType);
165 if (m_numElem <= 0x7F)
167 buf[iBuf++] = (byte)(m_numElem & 0xFF);
168 } else if (m_numElem <= 0x3FFF)
170 buf[iBuf++] = (byte)((m_numElem >> 8) | 0x80);
171 buf[iBuf++] = (byte)(m_numElem & 0xFF);
172 } else if (m_numElem <= 0x1FFFFFFF)
174 buf[iBuf++] = (byte)((m_numElem >> 24) | 0xC0);
175 buf[iBuf++] = (byte)((m_numElem >> 16) & 0xFF);
176 buf[iBuf++] = (byte)((m_numElem >> 8) & 0xFF);
177 buf[iBuf++] = (byte)((m_numElem) & 0xFF);
182 buf[0] = (byte) (m_unmanagedType);