Listing 1: Managed part of a method invocation object Context.lookup( string name ) { //prepare the arguments int hName = PinvokeHelper.toJavaString( name ); //call the method string cls = "javax/naming/Context"; string mname = "lookup"; string sig = "(Ljava/lang/String;)Ljava/lang/Object;"; int hResult = PinvokeHelper.callObjectMethod( this.Jobject, cls, mname, sig, hName ); //prepare the result if( hResult == 0 ) return null; else return FrameworkHelper.findBestProxyType( hResult ); } Listing 2: PInvoke interface defined in PinvokeHelper [DllImport("unmanagedlib")] int toJavaString( [MarshalAs(UnmanagedType.LPWStr)] string name ); [DllImport("unmanagedlib")] int callObjectMethod( int theObject, [MarshalAs(UnmanagedType.LPWStr)] string cls, [MarshalAs(UnmanagedType.LPWStr)] string mname, [MarshalAs(UnmanagedType.LPWStr)] string sig, int arg ); Listing 3: Unmanaged part of a method invocation extern "C" __declspec(dllexport) int __stdcall callObjectMethod( int theObject, LPWSTR cls, LPWSTR mname, LPWSTR sig, int arg ) { char * utfClassName = toUtf8( cls ); //utility function char * utfMethodname = toUtf8( mname ); char * utfSig = toUtf8( sig ); JNIEnv * env = launchOrAttach(); //utility function jclass clazz = env->FindClass( utfClassName ); int methodID = env->GetMethodID(clazz, utfMethodname, utfSig ); jobject result = 0; result = env->CallObjectMethod( (jobject)theObject, methodID, arg ); return result; } Listing 4: Configuration File XML snippet Listing 5: MessageListener implementation public class MyMessageListener : javax.jms.MessageListener { public void onMessage( Message m ) { if( m is TextMessage ) Console.WriteLine( "The message is {0}", m.getText() ); Else Console.WriteLine( "Sorry, we only handle TextMessages" ); } } Listing 6: MessageListener usage public static void Main( string[] ) { … try { QueueConnectionFactory qcf = ctx.lookup( "QCF" ); QueueConnection qc = qcf.createQueueConnection(); QueueSession qs = qc.createQueueSession( false, SessionImpl.AUTO_ACKNOWLEDGE ); Queue q = ctx.lookup( "testqueue" ); QueueReceiver qrcv = qs.createReceiver( q ); qrcv.setMessageListener( new MyMessageListener() ); qc.start(); … } catch( NamingException ne ) { } catch( JMSException jmse ) { } catch( Exception e ) { } } Listing 7: Swing GUI from .NET using System; using Codemesh.JuggerNET; using javax.swing; public class SwingGUI { public static void Main( string[] args ) { string color = JOptionPane.showInputDialog( "Your color pick?" ); Console.WriteLine( "Your favorite color is {0}", color ); } } Listing 8: EJB access from .NET using System; using Codemesh.JuggerNET; using com.codemesh.ejbtest; using java.lang; using java.util; using javax.naming; public class EJB { public static void Main( string[] args ) { try { InitialContext ictx = new InitialContext(); MyEJBHome home = (MyEJBHome)ictx.lookup( "myejb" ); if( home != null ) { Date date = home.getDeliveryDate(); Console.WriteLine( "The delivery date is {0}", date ); } else Console.WriteLine( "Couldn't find 'myejb'" ); } catch( Exception e ) { Console.WriteLine( "StackTrace: {0}", e.StackTrace ); Console.WriteLine( "Message: {0}", e.Message ); } } }