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 IntPtr realPtr = new IntPtr (pNativeData.ToInt64 () - Marshal.SizeOf (typeof (int)));
30 Marshal.FreeHGlobal (realPtr);
35 // I really do not understand the purpose of this method
36 // or went it would be called. In fact, Rotor never seems
38 public int GetNativeDataSize ()
40 Console.WriteLine("GetNativeDataSize() called");
44 public IntPtr MarshalManagedToNative (object managedObj)
50 number = Convert.ToInt32 (managedObj);
51 ptr = Marshal.AllocHGlobal (8);
52 Marshal.WriteInt32 (ptr, 0);
53 Marshal.WriteInt32 (new IntPtr (ptr.ToInt64 () + Marshal.SizeOf (typeof(int))), number);
54 return new IntPtr (ptr.ToInt64 () + Marshal.SizeOf (typeof (int)));
61 // Convert a pointer to unmanaged data into a System.Object.
62 // This method simply converts the unmanaged Ansi C-string
63 // into a System.String and surrounds it with asterisks
64 // to differentiate it from the default marshaler.
65 public object MarshalNativeToManaged (IntPtr pNativeData)
67 return "*" + Marshal.PtrToStringAnsi( pNativeData ) + "*";
73 [DllImport("libtest")]
74 private static extern int printInt([MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(MyMarshal ))] object number );
76 [DllImport("libtest")]
77 private static extern void callFunction (Delegate d);
79 delegate void Del ([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(MyMarshal))] string x);
81 public static void TestMethod (string s)
83 Console.WriteLine("s = {0}", s);
85 throw new Exception ("received wrong value");
88 public static int Main()
91 if (printInt (x) != 6)
94 Del del = new Del (TestMethod);