Re: How to pass a Java callable to C#?

Jeroen Frijters <[email protected]>
Newsgroups gmane.comp.java.ikvm.devel
Message-ID <[email protected]>
>From the Java side, the on_click method signature is:

on_click(Lcli/System/Func$$00602_$$$_Ljava__lang__Object_$$_Ljava__lang__Object_$$$$_)V

The ugliness of the name is due to generics, but not really relevant to this discussion.

If you reflect on this class, you can determine it is a .NET delegate (it extends cli.System.MulticastDelegate and has a nested class called Method with a single Invoke method and it (the delegate class) has a constructor taking a reference to the inner Method interface).

BTW, I just realized you can also use one of the static methods on Delegate to create a delegate to the specified method and simply pass that.

Regards,
Jeroen

> -----Original Message-----
> From: Doug Blank [mailto:[email protected]]
> Sent: Monday, February 17, 2014 16:25
> To: Jeroen Frijters
> Cc: [email protected]
> Subject: Re: [Ikvm-developers] How to pass a Java callable to C#?
> 
> On Sun, Feb 16, 2014 at 8:41 AM, Jeroen Frijters <[email protected]
> <mailto:[email protected]> > wrote:
> 
> 
> 	Hi Doug,
> 
> 	Your C# on_click method is callable from (IKVM) Java.
> 
> 	You'll need to generate a class that implements the
> cli.System.Func$$00602_$$$_Ljava__lang__Object_$$_Ljava__lang__Object_$$
> $$_$Method interface.
> 
> 
> 
> 
> Jeroen,
> 
> Thanks for these details; can you expand a bit on this?
> Where did the name
> "cli.System.Func$$00602_$$$_Ljava__lang__Object_$$_Ljava__lang__Object_$
> $$$_$Method" come from?
> What is that?
> How do you create an interface that implements it?
> 
> I've read and googled looking for details on signatures and IKVM, but I
> can't find anything that appears to be relevant.
> 
> -Doug
> 
> 
> 	This class can then be instantiated and passed to the constructor
> of the
> cli.System.Func$$00602_$$$_Ljava__lang__Object_$$_Ljava__lang__Object_$$
> $$_ class (the delegate) and this object can be passed to the on_click
> method.
> 
> 
> 	Regards,
> 	Jeroen
> 
> 	> -----Original Message-----
> 	> From: Doug Blank [mailto:[email protected]
> <mailto:[email protected]> ]
> 
> 	> Sent: Sunday, February 16, 2014 13:46
> 	> To: Jeroen Frijters
> 	> Cc: [email protected] <mailto:ikvm-
> [email protected]>
> 	> Subject: Re: [Ikvm-developers] How to pass a Java callable to C#?
> 	>
> 	> Jeroen,
> 	>
> 	> Thanks for the feedback, but I think I didn't explain very well
> my
> 	> problem. The Widget library is written in C# and is being used by
> the
> 	> Java interpreter (running on the CLR). I wish to be able to
> register the
> 	> callback in Java.
> 	>
> 	> This works in IronPython, because IronPython knows how to map
> Python
> 	> functions onto Func<object,object>:
> 	>
> 	> """
> 	> from Widgets import Widget
> 	> def f(obj):
> 	>     print("Click!")
> 	> w = Widget()
> 	> w.on_click(f)
> 	> """
> 	>
> 	> I have the same working in a Scheme running on the CLR, because I
> can
> 	> define and wrap around callback1 in C#  to map it to
> 	> Func<object,object>:
> 	>
> 	> """
> 	> (using "Widgets")
> 	> (define f (lambda (obj) (printf "~a\n" obj)) (define w (Widget))
> 	> (w.on_click (callback1 f)) """
> 	>
> 	> So, I'm trying to figure out how to do the same thing in Java:
> map
> 	> something in Java onto Func<object,object>, so something like
> this will
> 	> work in DynamicJava:
> 	>
> 	> """
> 	> import static cli.Widgets.*;
> 	>
> 	> public int f(Object widget) {
> 	> }
> 	>
> 	> Widget w = new Widget();
> 	> w.on_click(f);
> 	> """
> 	>
> 	> Does ikvm have something built-in to help pass a Java function to
> C#? Or
> 	> do you have a general strategy for doing this?
> 	>
> 	> Thanks for any further hints,
> 	>
> 	> -Doug
> 	>
> 	>
> 	> On Sun, Feb 16, 2014 at 4:21 AM, Jeroen Frijters
> <[email protected] <mailto:[email protected]>
> 
> 	> <mailto:[email protected] <mailto:[email protected]> > > wrote:
> 	>
> 	>
> 	>       Hi Doug,
> 	>
> 	>       I'm probably misunderstanding the question, but in Java
> you'd use
> 	> interfaces for this. See
> 	>
> http://docs.oracle.com/javase/7/docs/api/java/awt/Button.html#addActionL
> 	> istener(java.awt.event.ActionListener) for example.
> 	>
> 	>       Regards,
> 	>       Jeroen
> 	>
> 	>
> 	>       > -----Original Message-----
> 	>       > From: Doug Blank [mailto:[email protected]
> <mailto:[email protected]>
> 	> <mailto:[email protected] <mailto:[email protected]> > ]
> 	>       > Sent: Sunday, February 16, 2014 0:57
> 
> 	>       > To: [email protected] <mailto:ikvm-
> [email protected]>  <mailto:ikvm- <mailto:ikvm->
> 	> [email protected]
> <mailto:[email protected]> >
> 	>       > Subject: [Ikvm-developers] How to pass a Java callable to
> C#?
> 	>       >
> 	>       > I am doing some refining on the DynamicJava interpreter
> written
> 	> in Java
> 	>       > that is running under Mono [1]. (C# libraries are made
> available
> 	> to the
> 	>       > interpreted Java through ikvmstub, and the Java
> interpreter is
> 	> running
> 	>       > by being compiled with ikvmc). Everything is working very
> well,
> 	> but one
> 	>       > thing I would like to do is be able to pass a Java
> callback to a
> 	> C#
> 	>       > function.
> 	>       >
> 	>       >
> 	>       > The C# code looks like this (although I could change it
> in any
> 	> manner):
> 	>       >
> 	>       >
> 	>       > public class Widget {
> 	>       > public void on_click(System.Func<object,object> function)
> {
> 	>       >         }
> 	>       > }
> 	>       >
> 	>       > In general, how would a Java program register a callback
> to the
> 	> C#? I
> 	>       > can write an interface on either the Java side, or the C#
> side.
> 	>       >
> 	>       > Thanks for any suggestions,
> 	>       >
> 	>       > -Doug
> 	>       >
> 	>       > [1] -
> 	>       >
> 	>
> https://bitbucket.org/ipre/calico/src/master/languages/Java/dynamicjava/
> 	>
> 	>
> 
> 
> 


------------------------------------------------------------------------------
Managing the Performance of Cloud-Based Applications
Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
Read the Whitepaper.
http://pubads.g.doubleclick.net/gampad/clk?id=121054471&iu=/4140/ostg.clktrk
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.