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