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 Marshal1 (int param) {
20 public static ICustomMarshaler GetInstance (string s) {
21 int param = Int32.Parse (s);
22 return new Marshal1 (param);
25 public void CleanUpManagedData (object managedObj)
27 //Console.WriteLine ("CleanUpManagedData called");
28 cleanup_managed_count ++;
31 public void CleanUpNativeData (IntPtr pNativeData)
33 //Console.WriteLine("CleanUpNativeData:" + pNativeData);
34 /* Might be allocated in libtest.c using g_new0 so dont free it */
35 int alloc_type = Marshal.ReadInt32 (pNativeData);
37 Marshal.FreeHGlobal (pNativeData);
38 cleanup_native_count ++;
41 // I really do not understand the purpose of this method
42 // or went it would be called. In fact, Rotor never seems
44 public int GetNativeDataSize ()
46 //Console.WriteLine("GetNativeDataSize() called");
50 public IntPtr MarshalManagedToNative (object managedObj)
55 number = Convert.ToInt32 (managedObj);
56 ptr = Marshal.AllocHGlobal (8);
57 Marshal.WriteInt32 (ptr, 1); /* Allocated by AllocHGlobal */
58 Marshal.WriteInt32(new IntPtr (ptr.ToInt64 () + 4), number);
60 //Console.WriteLine ("ToNative: " + ptr);
64 public object MarshalNativeToManaged (IntPtr pNativeData)
66 //Console.WriteLine ("ToManaged: " + pNativeData);
67 return param + Marshal.ReadInt32 (new IntPtr (pNativeData.ToInt64 () + 4));
73 public static int Main (string[] args) {
74 return TestDriver.RunTests (typeof (Tests));
77 [DllImport ("libtest")]
78 [return : MarshalAs(UnmanagedType.CustomMarshaler,MarshalTypeRef = typeof
79 (Marshal1), MarshalCookie = "5")]
80 private static extern object mono_test_marshal_pass_return_custom (int i,
81 [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof (Marshal1), MarshalCookie = "5")] object number, int j);
83 public static int test_0_pass_return () {
85 Marshal1.cleanup_managed_count = 0;
86 Marshal1.cleanup_native_count = 0;
88 int res = (int)mono_test_marshal_pass_return_custom (5, 10, 5);
90 if (Marshal1.cleanup_managed_count != 0)
92 if (Marshal1.cleanup_native_count != 2)
95 return res == 15 ? 0 : 3;
98 [return : MarshalAs(UnmanagedType.CustomMarshaler,MarshalTypeRef = typeof
99 (Marshal1), MarshalCookie = "5")] public delegate object pass_return_int_delegate ([MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof (Marshal1), MarshalCookie = "5")] object o);
101 [DllImport ("libtest")]
102 private static extern int mono_test_marshal_pass_return_custom_in_delegate (pass_return_int_delegate del);
104 private static object pass_return_int (object i) {
108 public static int test_0_pass_return_delegate () {
110 Marshal1.cleanup_managed_count = 0;
111 Marshal1.cleanup_native_count = 0;
113 int res = mono_test_marshal_pass_return_custom_in_delegate (new pass_return_int_delegate (pass_return_int));
115 if (Marshal1.cleanup_managed_count != 2)
117 if (Marshal1.cleanup_native_count != 0)
120 return res == 15 ? 0 : 3;