+ [DllImport ("libtest")]
+ private static extern int mono_test_marshal_pass_out_custom (int i,
+ [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof (Marshal1), MarshalCookie = "5"), Out] out object number, int j);
+
+ public static int test_0_pass_out () {
+
+ Marshal1.cleanup_managed_count = 0;
+ Marshal1.cleanup_native_count = 0;
+
+ object o = 0;
+ int res = mono_test_marshal_pass_out_custom (5, out o, 5);
+
+ /* 10 + 5 + 5 + 5 */
+ if ((int)o != 25)
+ return 1;
+
+ if (Marshal1.cleanup_managed_count != 0)
+ return 2;
+ if (Marshal1.cleanup_native_count != 1)
+ return 3;
+
+ return 0;
+ }
+
+ [DllImport ("libtest")]
+ private static extern int mono_test_marshal_pass_inout_custom (int i,
+ [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof (Marshal1), MarshalCookie = "5"), In, Out] object number, int j);
+
+ public static int test_0_pass_inout () {
+ Marshal1.cleanup_managed_count = 0;
+ Marshal1.cleanup_native_count = 0;
+ Marshal1.native_to_managed_result = null;
+
+ int res = mono_test_marshal_pass_inout_custom (5, 5, 5);
+
+ // The changes made by the [Out] custom marshaller are not visible to the caller
+ if ((int)Marshal1.native_to_managed_result != 20)
+ return 1;
+
+ if (Marshal1.cleanup_managed_count != 0)
+ return 2;
+ if (Marshal1.cleanup_native_count != 1)
+ return 3;
+
+ return 0;
+ }
+
+ [DllImport ("libtest")]
+ private static extern int mono_test_marshal_pass_out_byval_custom (int i,
+ [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof (Marshal1), MarshalCookie = "5"), Out] object number, int j);
+
+ public static int test_0_pass_out_byval () {
+ Marshal1.cleanup_managed_count = 0;
+ Marshal1.cleanup_native_count = 0;
+ Marshal1.native_to_managed_result = null;
+
+ // MS.NET passes NULL and does no marshalling in this case
+ int res = mono_test_marshal_pass_out_byval_custom (5, 5, 5);
+
+ if (res != 0)
+ return 1;
+
+ if (Marshal1.native_to_managed_result != null)
+ return 2;
+
+ if (Marshal1.cleanup_managed_count != 0)
+ return 3;
+ if (Marshal1.cleanup_native_count != 0)
+ return 4;
+
+ return 0;
+ }
+
+ [DllImport ("libtest")]
+ private static extern int mono_test_marshal_pass_byref_custom (int i,
+ [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof (Marshal1), MarshalCookie = "5")] ref object number, int j);
+
+ public static int test_0_pass_ref () {
+
+ Marshal1.cleanup_managed_count = 0;
+ Marshal1.cleanup_native_count = 0;
+
+ object o = 10;
+ int res = mono_test_marshal_pass_byref_custom (5, ref o, 5);
+
+ /* 10 + 5 + 5 + 5 */
+ if ((int)o != 25)
+ return 1;
+
+ if (Marshal1.cleanup_managed_count != 0)
+ return 2;
+ if (Marshal1.cleanup_native_count != 1)
+ return 3;
+
+ return 0;
+ }
+