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)