mscorlib(4.0.0.0) API with additions
UnmanagedMarshal.cs
3 
5 {
8  [ComVisible(true)]
9  [Obsolete("An alternate API is available: Emit the MarshalAs custom attribute instead. http://go.microsoft.com/fwlink/?linkid=14202")]
10  [HostProtection(SecurityAction.LinkDemand, MayLeakOnAbort = true)]
11  public sealed class UnmanagedMarshal
12  {
13  internal UnmanagedType m_unmanagedType;
14 
15  internal Guid m_guid;
16 
17  internal int m_numElem;
18 
19  internal UnmanagedType m_baseType;
20 
23  public UnmanagedType GetUnmanagedType => m_unmanagedType;
24 
28  public Guid IIDGuid
29  {
30  get
31  {
32  if (m_unmanagedType == UnmanagedType.CustomMarshaler)
33  {
34  return m_guid;
35  }
36  throw new ArgumentException(Environment.GetResourceString("Argument_NotACustomMarshaler"));
37  }
38  }
39 
43  public int ElementCount
44  {
45  get
46  {
47  if (m_unmanagedType != UnmanagedType.ByValArray && m_unmanagedType != UnmanagedType.ByValTStr)
48  {
49  throw new ArgumentException(Environment.GetResourceString("Argument_NoUnmanagedElementCount"));
50  }
51  return m_numElem;
52  }
53  }
54 
58  public UnmanagedType BaseType
59  {
60  get
61  {
62  if (m_unmanagedType != UnmanagedType.LPArray && m_unmanagedType != UnmanagedType.SafeArray)
63  {
64  throw new ArgumentException(Environment.GetResourceString("Argument_NoNestedMarshal"));
65  }
66  return m_baseType;
67  }
68  }
69 
75  {
76  if (unmanagedType == UnmanagedType.ByValTStr || unmanagedType == UnmanagedType.SafeArray || unmanagedType == UnmanagedType.CustomMarshaler || unmanagedType == UnmanagedType.ByValArray || unmanagedType == UnmanagedType.LPArray)
77  {
78  throw new ArgumentException(Environment.GetResourceString("Argument_NotASimpleNativeType"));
79  }
80  return new UnmanagedMarshal(unmanagedType, Guid.Empty, 0, (UnmanagedType)0);
81  }
82 
87  public static UnmanagedMarshal DefineByValTStr(int elemCount)
88  {
89  return new UnmanagedMarshal(UnmanagedType.ByValTStr, Guid.Empty, elemCount, (UnmanagedType)0);
90  }
91 
97  {
98  return new UnmanagedMarshal(UnmanagedType.SafeArray, Guid.Empty, 0, elemType);
99  }
100 
105  public static UnmanagedMarshal DefineByValArray(int elemCount)
106  {
107  return new UnmanagedMarshal(UnmanagedType.ByValArray, Guid.Empty, elemCount, (UnmanagedType)0);
108  }
109 
115  {
116  return new UnmanagedMarshal(UnmanagedType.LPArray, Guid.Empty, 0, elemType);
117  }
118 
119  private UnmanagedMarshal(UnmanagedType unmanagedType, Guid guid, int numElem, UnmanagedType type)
120  {
121  m_unmanagedType = unmanagedType;
122  m_guid = guid;
123  m_numElem = numElem;
124  m_baseType = type;
125  }
126 
127  internal byte[] InternalGetBytes()
128  {
129  if (m_unmanagedType == UnmanagedType.SafeArray || m_unmanagedType == UnmanagedType.LPArray)
130  {
131  int num = 2;
132  byte[] array = new byte[num];
133  array[0] = (byte)m_unmanagedType;
134  array[1] = (byte)m_baseType;
135  return array;
136  }
137  if (m_unmanagedType == UnmanagedType.ByValArray || m_unmanagedType == UnmanagedType.ByValTStr)
138  {
139  int num2 = 0;
140  int num3 = (m_numElem <= 127) ? 1 : ((m_numElem > 16383) ? 4 : 2);
141  num3++;
142  byte[] array = new byte[num3];
143  array[num2++] = (byte)m_unmanagedType;
144  if (m_numElem <= 127)
145  {
146  array[num2++] = (byte)(m_numElem & 0xFF);
147  }
148  else if (m_numElem <= 16383)
149  {
150  array[num2++] = (byte)((m_numElem >> 8) | 0x80);
151  array[num2++] = (byte)(m_numElem & 0xFF);
152  }
153  else if (m_numElem <= 536870911)
154  {
155  array[num2++] = (byte)((m_numElem >> 24) | 0xC0);
156  array[num2++] = (byte)((m_numElem >> 16) & 0xFF);
157  array[num2++] = (byte)((m_numElem >> 8) & 0xFF);
158  array[num2++] = (byte)(m_numElem & 0xFF);
159  }
160  return array;
161  }
162  return new byte[1]
163  {
164  (byte)m_unmanagedType
165  };
166  }
167  }
168 }
static UnmanagedMarshal DefineLPArray(UnmanagedType elemType)
Specifies an LPArray to marshal to unmanaged code. The length of an LPArray is determined at runtime ...
static UnmanagedMarshal DefineByValArray(int elemCount)
Specifies a fixed-length array (ByValArray) to marshal to unmanaged code.
UnmanagedType GetUnmanagedType
Indicates an unmanaged type. This property is read-only.
Definition: __Canon.cs:3
static UnmanagedMarshal DefineUnmanagedMarshal(UnmanagedType unmanagedType)
Specifies a given type that is to be marshaled to unmanaged code.
Guid IIDGuid
Gets a GUID. This property is read-only.
SecurityAction
Specifies the security actions that can be performed using declarative security.
Provides information about, and means to manipulate, the current environment and platform....
Definition: Environment.cs:21
Represents a globally unique identifier (GUID).To browse the .NET Framework source code for this type...
Definition: Guid.cs:14
static UnmanagedMarshal DefineSafeArray(UnmanagedType elemType)
Specifies a SafeArray to marshal to unmanaged code.
int ElementCount
Gets a number element. This property is read-only.
static UnmanagedMarshal DefineByValTStr(int elemCount)
Specifies a string in a fixed array buffer (ByValTStr) to marshal to unmanaged code.
UnmanagedType
Identifies how to marshal parameters or fields to unmanaged code.
Definition: UnmanagedType.cs:7
The exception that is thrown when one of the arguments provided to a method is not valid.
Represents the class that describes how to marshal a field from managed to unmanaged code....
Specifies that the class can be serialized.
static readonly Guid Empty
A read-only instance of the T:System.Guid structure whose value is all zeros.
Definition: Guid.cs:126
UnmanagedType BaseType
Gets an unmanaged base type. This property is read-only.