+ Marshal1.cleanup_managed_count = 0;
+ Marshal1.cleanup_native_count = 0;
+
+ int res = mono_test_marshal_pass_return_custom_null_in_delegate (new pass_return_int_delegate (pass_return_null));
+
+ if (Marshal1.cleanup_managed_count != 0)
+ return 1;
+ if (Marshal1.cleanup_native_count != 0)
+ return 2;
+
+ return res == 15 ? 0 : 3;
+ }
+
+ /*
+ * Test custom marshaller class not implementing ICustomMarshaler
+ */
+
+ public class Marshal2 {
+ }
+
+ [DllImport ("libtest")]
+ private static extern IntPtr mono_test_marshal_pass_return_custom2 (int i,
+ [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof (Marshal3), MarshalCookie = "5")] object number, int j);
+
+ public static int test_0_not_icustommarshaller () {
+ try {
+ mono_test_marshal_pass_return_custom2 (5, 10, 5);
+ }
+ catch (ApplicationException) {
+ return 0;
+ }
+ return 1;
+ }
+
+
+ /*
+ * Test custom marshaller class missing GetInstance method
+ */
+
+ public class Marshal3 : ICustomMarshaler {
+ public void CleanUpManagedData (object managedObj)
+ {
+ }
+
+ public void CleanUpNativeData (IntPtr pNativeData)
+ {
+ }
+
+ public int GetNativeDataSize ()
+ {
+ return 4;
+ }
+
+ public IntPtr MarshalManagedToNative (object managedObj)
+ {
+ return IntPtr.Zero;
+ }
+
+ public object MarshalNativeToManaged (IntPtr pNativeData)
+ {
+ return null;
+ }
+ }
+
+ public class Marshal4 : Marshal3 {
+ public static object GetInstance (string s) {
+ return null;
+ }
+ }
+
+ public class Marshal5 : Marshal3 {
+ public static ICustomMarshaler GetInstance (object s) {
+ return null;
+ }
+ }
+
+ [DllImport ("libtest", EntryPoint = "mono_test_marshal_pass_return_custom2")]
+ private static extern IntPtr mono_test_marshal_pass_return_custom3 (int i,
+ [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof (Marshal3), MarshalCookie = "5")] object number, int j);
+
+ [DllImport ("libtest", EntryPoint = "mono_test_marshal_pass_return_custom2")]
+ private static extern IntPtr mono_test_marshal_pass_return_custom4 (int i,
+ [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof (Marshal4), MarshalCookie = "5")] object number, int j);
+
+ [DllImport ("libtest", EntryPoint = "mono_test_marshal_pass_return_custom2")]
+ private static extern IntPtr mono_test_marshal_pass_return_custom5 (int i,
+ [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof (Marshal5), MarshalCookie = "5")] object number, int j);
+
+ public static int test_0_missing_getinstance1 () {
+ try {
+ mono_test_marshal_pass_return_custom3 (5, 10, 5);
+ }
+ catch (ApplicationException) {
+ return 0;
+ }
+ return 1;
+ }
+
+ public static int test_0_missing_getinstance2 () {
+ try {
+ mono_test_marshal_pass_return_custom4 (5, 10, 5);
+ }
+ catch (ApplicationException) {
+ return 0;
+ }
+ return 1;
+ }
+
+ public static int test_0_missing_getinstance3 () {
+ try {
+ mono_test_marshal_pass_return_custom5 (5, 10, 5);
+ }
+ catch (ApplicationException) {
+ return 0;
+ }
+ return 1;
+ }
+
+ public class Marshal6 : ICustomMarshaler {
+ public static int managed_to_native_count = 0;
+ public static int native_to_managed_count = 0;
+
+ public static ICustomMarshaler GetInstance (string s)
+ {
+ return new Marshal6 ();
+ }
+
+ public void CleanUpManagedData (object managedObj)
+ {
+ }
+
+ public void CleanUpNativeData (IntPtr pNativeData)
+ {
+ }
+
+ public int GetNativeDataSize ()
+ {
+ return 4;
+ }
+
+ public IntPtr MarshalManagedToNative (object managedObj)
+ {
+ managed_to_native_count++;
+ return IntPtr.Zero;
+ }
+
+ public object MarshalNativeToManaged (IntPtr pNativeData)
+ {
+ native_to_managed_count++;
+ return null;
+ }
+ }
+
+ public delegate void custom_out_param_delegate ([MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof (Marshal6), MarshalCookie = "5")] out object o);
+
+ [DllImport ("libtest")]
+ private static extern int mono_test_marshal_custom_out_param_delegate (custom_out_param_delegate del);
+
+ // ICustomMarshaler.MarshalNativeToManaged should not be called when the
+ // parameter is marked as an out.
+ public static int test_0_native_to_managed_custom_parameter ()
+ {
+ Marshal6.managed_to_native_count = 0;
+ Marshal6.native_to_managed_count = 0;
+
+ int res = mono_test_marshal_custom_out_param_delegate (new custom_out_param_delegate (custom_out_param));
+
+ if (Marshal6.managed_to_native_count != 1)
+ return 1;
+ if (Marshal6.native_to_managed_count != 0)
+ return 2;
+
+ return 0;
+ }
+
+ [MonoPInvokeCallback (typeof (custom_out_param_delegate))]
+ private static void custom_out_param (out object i)
+ {
+ i = new object();
+ }