<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
Thank you very much.  Between your post (Duane) and the post from Andreas (and the embed mono page at &lt;<a href="http://www.mono-project.com/Embedding_Mono">http://www.mono-project.com/Embedding_Mono</a>>),  I have been able to successfully call my C# methods from ObjC in XCode as well as get return values from functions and values from public variables.  Now I am in the process of writing a couple of Objective-C wrapper classes to invoke methods in my C# classes.<div><br></div><div><br></div><div>Since I am doing my front end using Objective-C and my model in C#, I was going to write an Objective-C Wrapper generator in C# that would, via reflection, analyze my .NET classes and generate Objective-C code that I could use as wrappers to invoke those classes.  Atleast a simple version that would support primitive types.  Before I started on this, I wanted to see if anyone knows of something like this that has been done.  I have found plenty of ways to call Cocoa from C#, but I don't think I am aware of anything to go the other way.<br><div><br></div><div>Thanks again.</div><div>Kevin<br><div><div><br></div><div><br></div><div><br></div><div><br><div><div>On Oct 25, 2008, at 8:22 AM, Duane Wandless wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">I will share what works for me.  First I use <a href="http://www.monobjc.net/">monobjc</a>.  Great documentation.  Easy to use.  Well supported.   I am using the latest mono install 2.0, though this worked with 1.9 as well.  And I use Xcode 3.1.  I place my mono EXE in build/Debug/MyCocoa.app/Content/Libraries, along with the Monobjc DLLs.  As you will see in the code (main.m) below, I load the EXE relative to the app bundle location.<br> <br>For me anyway I hit a bug in 2.0 that required me to load an EXE rather than a DLL.  In some ways the EXE is better.  I have a Program.cs (see below) that initializes the MonoObjc environment.  It is important to load the MonoObjc environment prior to Cocoa setting up the IB references.  This way when the NIB file is loaded it will find your [ObjectiveCClass] references, see MainForm.cs below, which is snippets only.  <br> <br>In my NIB file I have an object that has its class MonoMessage.  I hookup the array, tree, outline view, fields, etc to this object.  At runtime they are hooked up to my mono class.  I have some objC code (MainDocument.m below) that sends messages to my mono class.  And my mono class sends messages back to the objC world.<br> <br>We wanted the best of both worlds.  The power of C# and the ability to reuse the code on Mac and Windows.  But we also wanted the native build environment for the Leopard frontend.  So not only was using IB a requirement but so was writing the UI code in objC.  Thanks to mono and monobjc we accomplished this with a very clean environment.<br> <br>You can also take the mono EXE and fully embed it within the cocoa app.  This way the end user is not required to install mono.  But that is a topic for a different thread.<br><br><ul><li>Other C Flags = -D_THREAD_SAFE -D_REENTRANT -I/Library/Frameworks/Mono.framework/Versions/2.0/include/mono-1.0 -I/Library/Frameworks/Mono.framework/Versions/2.0/include/glib-2.0 -I/Library/Frameworks/Mono.framework/Versions/2.0/lib/glib-2.0/include</li> <li>Other C++ Flags = $(OTHER_CFLAGS)</li><li>OTHER_LDFLAGS = -pthread -L/Library/Frameworks/Mono.framework/Versions/Current/lib -lmono -lpthread -lm -lgthread-2.0 -lglib-2.0 -lintl -rpath@loader_path/../Libraries</li></ul> <br><br>main.m:<br><span style="font-family: courier new,monospace;">#import &lt;Cocoa/Cocoa.h><br>#include &lt;mono/jit/jit.h></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">#include &lt;mono/metadata/assembly.h></span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">#include &lt;mono/metadata/mono-config.h></span><br style="font-family: courier new,monospace;"><br><span style="font-family: courier new,monospace;">int main(int argc, char *argv[])</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">{</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    NSAutoreleasePool *pool;</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">    pool = [[NSAutoreleasePool alloc] init];</span><br><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    MonoDomain *domain;</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">    NSString *libraryPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Contents/Libraries"];</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">    NSString *sampleAssemblyPath = [libraryPath stringByAppendingPathComponent:@"MacMonoClient.exe"];</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    NSLog(@"libraryPath: %@", sampleAssemblyPath);</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">    mono_config_parse ("config");</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    domain = mono_jit_init ([sampleAssemblyPath UTF8String]);</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">    MonoAssembly *monoAssembly = mono_domain_assembly_open(domain, [sampleAssemblyPath UTF8String]);</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    mono_jit_exec (domain, monoAssembly, 1, argv);</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">    NSLog(@"sample assembly: %p", monoAssembly);</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    [pool release];</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">    </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    return NSApplicationMain(argc, (const char **) argv);</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">}</span><br><br>Program.cs:<br><span style="font-family: courier new,monospace;">using System;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">using Monobjc;</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">using Monobjc.Cocoa;</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">namespace MacClient</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">{</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    static class Program</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">    {</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">       public static void Main()</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">       {</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">            ObjectiveCRuntime.LoadFramework("Cocoa");</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">            ObjectiveCRuntime.LoadFramework("QTKit");</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">            ObjectiveCRuntime.Initialize();</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">       }</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    }</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">}</span><br> <br>MainForm.cs:<br><span style="font-family: courier new,monospace;">using System;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">using Monobjc;</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">using Monobjc.Cocoa;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">using Monobjc.QuickTime;</span><br style="font-family: courier new,monospace;"> <br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">namespace MacClient</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">{</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">    [ObjectiveCClass("MonoMessage")]</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    public class MyControl : NSObject</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">    {</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        private static readonly Class ControllerClass = Class.GetClassFromType(typeof(MyControl));</span><br style="font-family: courier new,monospace;"> <br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        public MyControl() { }</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        public MyControl(IntPtr np) : base(np) { }</span><br style="font-family: courier new,monospace;"> <br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        NSAutoreleasePool pool = new NSAutoreleasePool();</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        ~MyControl()</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">        {</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">            pool.Drain();</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">        }</span><br><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        [ObjectiveCField]</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">        public NSArrayController projectsController;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        [ObjectiveCField("itemsController")]</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">        public NSTreeController folderContent;</span><br><span style="font-family: courier new,monospace;">        [ObjectiveCField]</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">        public NSOutlineView folderOutline;</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        [ObjectiveCMessage("init")]</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">        public override Id Init()</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        {</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;"></span><span style="font-family: courier new,monospace;">            ObjectiveCRuntime.SendMessageSuper&lt;IntPtr>(this, ControllerClass, "init");</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">            NSNotificationCenter.DefaultCenter.AddObserverSelectorNameObject(this, ObjectiveCRuntime.Selector("doAuth:"), "doAuth", null);</span><br>                <span style="font-family: courier new,monospace;"> }</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">        [ObjectiveCMessage("awakeFromNib")]</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        public void awakeFromNib()</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">        {</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        }</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">        [ObjectiveCMessage("doAuth:")]</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        public void SelectionChanged(NSNotification notification)</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">        {</span><span style="font-family: courier new,monospace;"></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">            NSArray loginParms = notification.UserInfo.ObjectForKey(new NSString("params")).CastTo&lt;NSArray>();</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">            Login(loginParms[0].CastTo&lt;NSString>(), loginParms[1].CastTo&lt;NSString>());</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        }</span><br> <span style="font-family: courier new,monospace;">    }<br>}<br><br><span style="font-family: arial,helvetica,sans-serif;">MainDocument.m</span><br>- (IBAction)login:(id)sender<br>{<br>    NSLog(@"Starting login process...");<br> <br>    NSString *username = [usernameTextField stringValue];<br>    NSString *password = [passwordTextField stringValue];<br><br>    NSArray *loginParams = [NSArray arrayWithObjects:username, password, nil];<br>    NSDictionary* dict =  [NSDictionary dictionaryWithObject:loginParams forKey:@"params"];<br>     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];<br>    [nc postNotificationName:@"doAuth" object:nil userInfo:dict];    <br>}<br><br></span><div class="gmail_quote">On Fri, Oct 24, 2008 at 10:13 PM, Kevin Heeney <span dir="ltr">&lt;<a href="mailto:koheeney@gmail.com">koheeney@gmail.com</a>></span> wrote:<br> <blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">   I think I have hit a wall.  I am fairly new to mono on mac; however am familiar with .NET and Objc/Cocoa.  I am unable to successfully 'embed mono' or call methods from my Mono dll in ObjC.  I have created a UI using Interface Builder and have my App Controller in ObjC ready to call my C# dll which contains my logic.  Cocoa# and ObjCSharp both claim to be 2 way bridges; however I can only find code for calling Cocoa from C# and not the other way around.  In addition, I cannot get the samples from &lt;<a href="http://www.mono-project.com/Embedding_Mono" target="_blank">http://www.mono-project.com/Embedding_Mono</a>> on Embedding Mono to work in XCode.  My actual issue with the latter is I cannot get XCode to link to the mono framework.  I am getting errors like "<span style="font-size: 11px;">main.c:1: error: mono/jit/jit.h: No such file or directory<span style="font-family: arial; font-size: 13px;">".</span></span><div> <div>   I am not sure what I am missing; it may be simple.  </div><div><br></div><div>Any guidance would be appreciated.</div><div>Thanks,</div><div>Kevin</div></div> <br>_______________________________________________<br> Mono-osx mailing list<br> <a href="mailto:Mono-osx@lists.ximian.com">Mono-osx@lists.ximian.com</a><br> <a href="http://lists.ximian.com/mailman/listinfo/mono-osx" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-osx</a><br> <br></blockquote></div><br></blockquote></div><br></div></div></div></div></body></html>