2 // marshal9.cs: tests for custom marshalling
6 using System
.Runtime
.InteropServices
;
8 public class Marshal1
: ICustomMarshaler
12 public static int cleanup_managed_count
= 0;
14 public static int cleanup_native_count
= 0;
16 public static int native_to_managed_count
= 0;
18 public static object native_to_managed_result
= null;
20 public Marshal1 (int param
) {
24 public static ICustomMarshaler
GetInstance (string s
) {
25 int param
= Int32
.Parse (s
);
26 return new Marshal1 (param
);
29 public void CleanUpManagedData (object managedObj
)
31 //Console.WriteLine ("CleanUpManagedData called");
32 cleanup_managed_count
++;
35 public void CleanUpNativeData (IntPtr pNativeData
)
37 //Console.WriteLine("CleanUpNativeData:" + pNativeData);
38 /* Might be allocated in libtest.c using g_new0 so dont free it */
39 int alloc_type
= Marshal
.ReadInt32 (pNativeData
);
41 Marshal
.FreeHGlobal (pNativeData
);
42 cleanup_native_count
++;
45 // I really do not understand the purpose of this method
46 // or when it would be called. In fact, Rotor never seems
48 public int GetNativeDataSize ()
50 //Console.WriteLine("GetNativeDataSize() called");
54 public IntPtr
MarshalManagedToNative (object managedObj
)
59 number
= Convert
.ToInt32 (managedObj
);
60 ptr
= Marshal
.AllocHGlobal (8);
61 Marshal
.WriteInt32 (ptr
, 1); /* Allocated by AllocHGlobal */
62 Marshal
.WriteInt32(new IntPtr (ptr
.ToInt64 () + 4), number
);
64 //Console.WriteLine ("ToNative: " + ptr);
68 public object MarshalNativeToManaged (IntPtr pNativeData
)
70 //Console.WriteLine ("ToManaged: " + pNativeData);
71 native_to_managed_count
++;
72 native_to_managed_result
= param
+ Marshal
.ReadInt32 (new IntPtr (pNativeData
.ToInt64 () + 4));
73 return native_to_managed_result
;
79 public static int Main (string[] args
) {
80 return TestDriver
.RunTests (typeof (Tests
));
84 [DllImport ("libtest")]
85 [return : MarshalAs(UnmanagedType
.CustomMarshaler
,MarshalTypeRef
= typeof
86 (Marshal1
), MarshalCookie
= "5")]
87 private static extern object mono_test_marshal_pass_return_custom (int i
,
88 [MarshalAs( UnmanagedType
.CustomMarshaler
, MarshalTypeRef
= typeof (Marshal1
), MarshalCookie
= "5")] object number
, int j
);
90 public static int test_0_pass_return () {
92 Marshal1
.cleanup_managed_count
= 0;
93 Marshal1
.cleanup_native_count
= 0;
94 Marshal1
.native_to_managed_count
= 0;
96 int res
= (int)mono_test_marshal_pass_return_custom (5, 10, 5);
98 if (Marshal1
.cleanup_managed_count
!= 0)
100 if (Marshal1
.cleanup_native_count
!= 2)
102 if (Marshal1
.native_to_managed_count
!= 1)
105 return res
== 15 ? 0 : 3;
108 [DllImport ("libtest")]
109 private static extern int mono_test_marshal_pass_out_custom (int i
,
110 [MarshalAs( UnmanagedType
.CustomMarshaler
, MarshalTypeRef
= typeof (Marshal1
), MarshalCookie
= "5"), Out
] out object number
, int j
);
112 public static int test_0_pass_out () {
114 Marshal1
.cleanup_managed_count
= 0;
115 Marshal1
.cleanup_native_count
= 0;
118 int res
= mono_test_marshal_pass_out_custom (5, out o
, 5);
124 if (Marshal1
.cleanup_managed_count
!= 0)
126 if (Marshal1
.cleanup_native_count
!= 1)
132 [DllImport ("libtest")]
133 private static extern int mono_test_marshal_pass_inout_custom (int i
,
134 [MarshalAs( UnmanagedType
.CustomMarshaler
, MarshalTypeRef
= typeof (Marshal1
), MarshalCookie
= "5"), In
, Out
] object number
, int j
);
136 public static int test_0_pass_inout () {
137 Marshal1
.cleanup_managed_count
= 0;
138 Marshal1
.cleanup_native_count
= 0;
139 Marshal1
.native_to_managed_result
= null;
141 int res
= mono_test_marshal_pass_inout_custom (5, 5, 5);
143 // The changes made by the [Out] custom marshaller are not visible to the caller
144 if ((int)Marshal1
.native_to_managed_result
!= 20)
147 if (Marshal1
.cleanup_managed_count
!= 0)
149 if (Marshal1
.cleanup_native_count
!= 1)
155 [DllImport ("libtest")]
156 private static extern int mono_test_marshal_pass_out_byval_custom (int i
,
157 [MarshalAs( UnmanagedType
.CustomMarshaler
, MarshalTypeRef
= typeof (Marshal1
), MarshalCookie
= "5"), Out
] object number
, int j
);
159 public static int test_0_pass_out_byval () {
160 Marshal1
.cleanup_managed_count
= 0;
161 Marshal1
.cleanup_native_count
= 0;
162 Marshal1
.native_to_managed_result
= null;
164 // MS.NET passes NULL and does no marshalling in this case
165 int res
= mono_test_marshal_pass_out_byval_custom (5, 5, 5);
170 if (Marshal1
.native_to_managed_result
!= null)
173 if (Marshal1
.cleanup_managed_count
!= 0)
175 if (Marshal1
.cleanup_native_count
!= 0)
181 [DllImport ("libtest")]
182 private static extern int mono_test_marshal_pass_byref_custom (int i
,
183 [MarshalAs( UnmanagedType
.CustomMarshaler
, MarshalTypeRef
= typeof (Marshal1
), MarshalCookie
= "5")] ref object number
, int j
);
185 public static int test_0_pass_ref () {
187 Marshal1
.cleanup_managed_count
= 0;
188 Marshal1
.cleanup_native_count
= 0;
191 int res
= mono_test_marshal_pass_byref_custom (5, ref o
, 5);
197 if (Marshal1
.cleanup_managed_count
!= 0)
199 if (Marshal1
.cleanup_native_count
!= 1)
205 [DllImport ("libtest")]
206 [return : MarshalAs(UnmanagedType
.CustomMarshaler
,MarshalTypeRef
= typeof
207 (Marshal1
), MarshalCookie
= "5")]
208 private static extern object mono_test_marshal_pass_return_custom_null (int i
,
209 [MarshalAs( UnmanagedType
.CustomMarshaler
, MarshalTypeRef
= typeof (Marshal1
), MarshalCookie
= "5")] object number
, int j
);
211 public static int test_0_pass_return_null () {
213 Marshal1
.cleanup_managed_count
= 0;
214 Marshal1
.cleanup_native_count
= 0;
216 object o
= mono_test_marshal_pass_return_custom_null (5, null, 5);
218 if (Marshal1
.cleanup_managed_count
!= 0)
220 if (Marshal1
.cleanup_native_count
!= 0)
223 return (o
== null) ? 0 : 1;
226 [return : MarshalAs(UnmanagedType
.CustomMarshaler
,MarshalTypeRef
= typeof
227 (Marshal1
), MarshalCookie
= "5")] public delegate object pass_return_int_delegate ([MarshalAs (UnmanagedType
.CustomMarshaler
, MarshalTypeRef
= typeof (Marshal1
), MarshalCookie
= "5")] object o
);
229 [DllImport ("libtest")]
230 private static extern int mono_test_marshal_pass_return_custom_in_delegate (pass_return_int_delegate del
);
232 [DllImport ("libtest")]
233 private static extern int mono_test_marshal_pass_return_custom_null_in_delegate (pass_return_int_delegate del
);
235 private static object pass_return_int (object i
) {
239 private static object pass_return_null (object i
) {
240 return (i
== null) ? null : new Object ();
243 public static int test_0_pass_return_delegate () {
245 Marshal1
.cleanup_managed_count
= 0;
246 Marshal1
.cleanup_native_count
= 0;
248 int res
= mono_test_marshal_pass_return_custom_in_delegate (new pass_return_int_delegate (pass_return_int
));
250 if (Marshal1
.cleanup_managed_count
!= 2)
252 if (Marshal1
.cleanup_native_count
!= 0)
255 return res
== 15 ? 0 : 3;
258 public static int test_0_pass_return_null_delegate () {
260 Marshal1
.cleanup_managed_count
= 0;
261 Marshal1
.cleanup_native_count
= 0;
263 int res
= mono_test_marshal_pass_return_custom_null_in_delegate (new pass_return_int_delegate (pass_return_null
));
265 if (Marshal1
.cleanup_managed_count
!= 0)
267 if (Marshal1
.cleanup_native_count
!= 0)
270 return res
== 15 ? 0 : 3;
274 * Test custom marshaller class not implementing ICustomMarshaler
277 public class Marshal2
{
280 [DllImport ("libtest")]
281 private static extern IntPtr
mono_test_marshal_pass_return_custom2 (int i
,
282 [MarshalAs( UnmanagedType
.CustomMarshaler
, MarshalTypeRef
= typeof (Marshal3
), MarshalCookie
= "5")] object number
, int j
);
284 public static int test_0_not_icustommarshaller () {
286 mono_test_marshal_pass_return_custom2 (5, 10, 5);
288 catch (ApplicationException
) {
296 * Test custom marshaller class missing GetInstance method
299 public class Marshal3
: ICustomMarshaler
{
300 public void CleanUpManagedData (object managedObj
)
304 public void CleanUpNativeData (IntPtr pNativeData
)
308 public int GetNativeDataSize ()
313 public IntPtr
MarshalManagedToNative (object managedObj
)
318 public object MarshalNativeToManaged (IntPtr pNativeData
)
324 public class Marshal4
: Marshal3
{
325 public static object GetInstance (string s
) {
330 public class Marshal5
: Marshal3
{
331 public static ICustomMarshaler
GetInstance (object s
) {
336 [DllImport ("libtest", EntryPoint
= "mono_test_marshal_pass_return_custom2")]
337 private static extern IntPtr
mono_test_marshal_pass_return_custom3 (int i
,
338 [MarshalAs( UnmanagedType
.CustomMarshaler
, MarshalTypeRef
= typeof (Marshal3
), MarshalCookie
= "5")] object number
, int j
);
340 [DllImport ("libtest", EntryPoint
= "mono_test_marshal_pass_return_custom2")]
341 private static extern IntPtr
mono_test_marshal_pass_return_custom4 (int i
,
342 [MarshalAs( UnmanagedType
.CustomMarshaler
, MarshalTypeRef
= typeof (Marshal4
), MarshalCookie
= "5")] object number
, int j
);
344 [DllImport ("libtest", EntryPoint
= "mono_test_marshal_pass_return_custom2")]
345 private static extern IntPtr
mono_test_marshal_pass_return_custom5 (int i
,
346 [MarshalAs( UnmanagedType
.CustomMarshaler
, MarshalTypeRef
= typeof (Marshal5
), MarshalCookie
= "5")] object number
, int j
);
348 public static int test_0_missing_getinstance1 () {
350 mono_test_marshal_pass_return_custom3 (5, 10, 5);
352 catch (ApplicationException
) {
358 public static int test_0_missing_getinstance2 () {
360 mono_test_marshal_pass_return_custom4 (5, 10, 5);
362 catch (ApplicationException
) {
368 public static int test_0_missing_getinstance3 () {
370 mono_test_marshal_pass_return_custom5 (5, 10, 5);
372 catch (ApplicationException
) {
378 public class Marshal6
: ICustomMarshaler
{
379 public static int managed_to_native_count
= 0;
380 public static int native_to_managed_count
= 0;
382 public static ICustomMarshaler
GetInstance (string s
)
384 return new Marshal6 ();
387 public void CleanUpManagedData (object managedObj
)
391 public void CleanUpNativeData (IntPtr pNativeData
)
395 public int GetNativeDataSize ()
400 public IntPtr
MarshalManagedToNative (object managedObj
)
402 managed_to_native_count
++;
406 public object MarshalNativeToManaged (IntPtr pNativeData
)
408 native_to_managed_count
++;
413 public delegate void custom_out_param_delegate ([MarshalAs (UnmanagedType
.CustomMarshaler
, MarshalTypeRef
= typeof (Marshal6
), MarshalCookie
= "5")] out object o
);
415 [DllImport ("libtest")]
416 private static extern int mono_test_marshal_custom_out_param_delegate (custom_out_param_delegate del
);
418 // ICustomMarshaler.MarshalNativeToManaged should not be called when the
419 // parameter is marked as an out.
420 public static int test_0_native_to_managed_custom_parameter ()
422 Marshal6
.managed_to_native_count
= 0;
423 Marshal6
.native_to_managed_count
= 0;
425 int res
= mono_test_marshal_custom_out_param_delegate (new custom_out_param_delegate (custom_out_param
));
427 if (Marshal6
.managed_to_native_count
!= 1)
429 if (Marshal6
.native_to_managed_count
!= 0)
435 private static void custom_out_param (out object i
)