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)
43 Console.WriteLine("MarshalManagedToNative()");
48 // Convert a pointer to unmanaged data into a System.Object.
49 // This method simply converts the unmanaged Ansi C-string
50 // into a System.String and surrounds it with asterisks
51 // to differentiate it from the default marshaler.
52 public object MarshalNativeToManaged (IntPtr pNativeData)
54 Console.WriteLine("MarshalNativeToManaged()");
55 return "*" + Marshal.PtrToStringAnsi( pNativeData ) + "*";
61 [DllImport("libtest.so")]
62 [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(MyMarshal))]
63 private static extern string functionReturningString();
65 public static int Main()
67 string res = functionReturningString();
68 Console.WriteLine ("native string function returns {0}", res);