3 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
5 // Permission is hereby granted, free of charge, to any person obtaining
6 // a copy of this software and associated documentation files (the
7 // "Software"), to deal in the Software without restriction, including
8 // without limitation the rights to use, copy, modify, merge, publish,
9 // distribute, sublicense, and/or sell copies of the Software, and to
10 // permit persons to whom the Software is furnished to do so, subject to
11 // the following conditions:
13 // The above copyright notice and this permission notice shall be
14 // included in all copies or substantial portions of the Software.
16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 // System.Reflection.Emit/UnmanagedMarshal.cs
29 // Paolo Molaro (lupus@ximian.com)
31 // (C) 2001-2002 Ximian, Inc. http://www.ximian.com
34 using System
.Reflection
.Emit
;
35 using System
.Runtime
.InteropServices
;
38 namespace System
.Reflection
.Emit
{
40 [Obsolete ("An alternate API is available: Emit the MarshalAs custom attribute instead.")]
43 public sealed class UnmanagedMarshal
{
44 #pragma warning disable 169, 414
46 private UnmanagedType t
;
47 private UnmanagedType tbase
;
52 private int param_num
;
53 private bool has_size
;
54 #pragma warning restore 169, 414
56 private UnmanagedMarshal (UnmanagedType maint
, int cnt
) {
61 private UnmanagedMarshal (UnmanagedType maint
, UnmanagedType elemt
) {
67 public UnmanagedType BaseType
{
69 if (t
== UnmanagedType
.LPArray
|| t
== UnmanagedType
.SafeArray
)
70 throw new ArgumentException ();
75 public int ElementCount
{
79 public UnmanagedType GetUnmanagedType
{
84 get {return new Guid (guid);}
87 public static UnmanagedMarshal
DefineByValArray( int elemCount
) {
88 return new UnmanagedMarshal (UnmanagedType
.ByValArray
, elemCount
);
91 public static UnmanagedMarshal
DefineByValTStr( int elemCount
) {
92 return new UnmanagedMarshal (UnmanagedType
.ByValTStr
, elemCount
);
95 public static UnmanagedMarshal
DefineLPArray( UnmanagedType elemType
) {
96 return new UnmanagedMarshal (UnmanagedType
.LPArray
, elemType
);
99 public static UnmanagedMarshal
DefineSafeArray( UnmanagedType elemType
) {
100 return new UnmanagedMarshal (UnmanagedType
.SafeArray
, elemType
);
103 public static UnmanagedMarshal
DefineUnmanagedMarshal( UnmanagedType unmanagedType
) {
104 return new UnmanagedMarshal (unmanagedType
, unmanagedType
);
107 /* this one is missing from the MS implementation */
108 public static UnmanagedMarshal
DefineCustom (Type typeref
, string cookie
, string mtype
, Guid id
) {
109 UnmanagedMarshal res
= new UnmanagedMarshal (UnmanagedType
.CustomMarshaler
, UnmanagedType
.CustomMarshaler
);
110 res
.mcookie
= cookie
;
111 res
.marshaltype
= mtype
;
112 res
.marshaltyperef
= typeref
;
113 if (id
== Guid
.Empty
)
114 res
.guid
= String
.Empty
;
116 res
.guid
= id
.ToString ();
120 // sizeConst and sizeParamIndex can be -1 meaning they are not specified
121 internal static UnmanagedMarshal
DefineLPArrayInternal (UnmanagedType elemType
, int sizeConst
, int sizeParamIndex
) {
122 UnmanagedMarshal res
= new UnmanagedMarshal (UnmanagedType
.LPArray
, elemType
);
123 res
.count
= sizeConst
;
124 res
.param_num
= sizeParamIndex
;
130 internal MarshalAsAttribute
ToMarshalAsAttribute () {
131 MarshalAsAttribute attr
= new MarshalAsAttribute (t
);
132 attr
.ArraySubType
= tbase
;
133 attr
.MarshalCookie
= mcookie
;
134 attr
.MarshalType
= marshaltype
;
135 attr
.MarshalTypeRef
= marshaltyperef
;
139 attr
.SizeConst
= count
;
141 attr
.SizeParamIndex
= 0;
143 attr
.SizeParamIndex
= (short)param_num
;