[Mono-osx] [ANN] objc3-sharp

Jesse Jones jesjones at mindspring.com
Mon Jun 9 05:43:06 EDT 2008


On Jun 8, 2008, at 11:24 PM, Jérôme Gagnon-Voyer wrote:

> When you say it's similar to Mono objc-sharp library, do you talk  
> about monobjc? http://www.monobjc.net/

No, I was talking about objc-sharp.
>
>
> Can you describe how is it faster and easier?
>
I confess this is the first time I've seen monobjc. It certainly looks  
better than objc-sharp, but I'm not sure its design is better than  
objc3-sharp (although it does look considerably more mature). Here are  
some points of comparison (which are based on a few minutes of  
inspection of the monobjc source, so take them with a grain of salt):

1) In monobjc methods are called like this:

Class cls1 = Class.GetClassFromName("TestClass04");
int result = ObjectiveCRuntime.SendMessage<int>(cls1, "TestWithA:b:",  
789, 345);

With objc3-sharp you would instead write this as:

Class cls1 = new Class("TestClass04");
int result = (int) cls1.Call("TestWithA:b:", 789, 345);

or even nicer:

int result = (int) Native.Call("[TestClass04 TestWithA:{0} b:{1}]",  
789, 345);

objc3-sharp will also let you chain calls (i.e.  
foo.Call(...).Call(...) which I don't think monobjc supports.

2) objc3-sharp calls are very efficient. Basically all that they do is  
marshal arguments into buffers and call into a small native library  
where libffi takes care of the platform calling conventions. monobjc  
is much much more complex. So complex, that I can't even figure out  
what it's doing when it makes a native call.

3) objc3-sharp handles exceptions well no matter where they are  
raised. If you call a native method and it raises NSException a  
CocoaException will be thrown when the native call returns. The  
CocoaException has a property which allows you to get the original  
NSException. If you call a native method which winds up calling a  
managed method and that throws, then the managed exception is  
serialized into an NSException which is then raised in the native glue  
library. If that exception makes it back to managed code a  
TargetInvocationException is thrown where the inner exception is the  
original exception.

As far as I can tell monobjc doesn't bridge exceptions at all.

4) monobjc doesn't seem to do anything to simplify reference counting.  
objc3-sharp relies on the GC to know when to release objects which  
dramatically simplifies reference count management.

5) objc3-sharp  is way way simpler than monobjc. This seems to be  
because objc3-sharp only supports 10.5, libffi plus a small native  
glue library makes marshaling easy, and objc3-sharp has a narrower  
focus: it's designed just to enable interop with Cocoa, not wrap the  
entire Cocoa framework.

<http://code.google.com/p/objc3-sharp/wiki/Usage> has some additional  
code snippets if you're curious.

  -- Jesse


More information about the Mono-osx mailing list