1 // A demonstration of a custom marshaler that marshals
2 // unmanaged to managed data.
5 using System.Runtime.InteropServices;
7 public class MyMarshal: ICustomMarshaler
10 // GetInstance() is not part of ICustomMarshaler, but
11 // custom marshalers are required to implement this
13 public static ICustomMarshaler GetInstance (string s)
15 Console.WriteLine ("GetInstance called");
16 return new MyMarshal ();
19 public void CleanUpManagedData (object managedObj)
21 Console.WriteLine ("CleanUpManagedData called");
24 public void CleanUpNativeData (IntPtr pNativeData)
26 Console.WriteLine("CleanUpNativeData called");
27 if (pNativeData != IntPtr.Zero)
28 Marshal.FreeHGlobal (pNativeData);
32 // I really do not understand the purpose of this method
33 // or went it would be called. In fact, Rotor never seems
35 public int GetNativeDataSize ()
37 Console.WriteLine("GetNativeDataSize() called");
41 public IntPtr MarshalManagedToNative (object managedObj)
47 number = Convert.ToInt32 (managedObj);
48 ptr = Marshal.AllocHGlobal (8);
49 Marshal.WriteInt32 (ptr, 0);
50 Marshal.WriteInt32 (new IntPtr (ptr.ToInt32 () + Marshal.SizeOf (typeof(int))), number);
58 // Convert a pointer to unmanaged data into a System.Object.
59 // This method simply converts the unmanaged Ansi C-string
60 // into a System.String and surrounds it with asterisks
61 // to differentiate it from the default marshaler.
62 public object MarshalNativeToManaged (IntPtr pNativeData)
64 return "*" + Marshal.PtrToStringAnsi( pNativeData ) + "*";
70 [DllImport("libtest")]
71 private static extern int printInt([MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(MyMarshal ))] object number );
73 [DllImport("libtest")]
74 private static extern void callFunction (Delegate d);
76 delegate void Del ([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(MyMarshal))] string x);
78 public static void TestMethod (string s)
80 Console.WriteLine("s = {0}", s);
82 throw new Exception ("received wrong value");
85 public static int Main()
88 if (printInt (x) != 6)
91 Del del = new Del (TestMethod);