<div class="gmail_quote">On 20 July 2011 16:05, Robert Jordan <span dir="ltr">&lt;<a href="mailto:robertj@gmx.net">robertj@gmx.net</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Hi Tom!<br></blockquote><div><br></div><div>Hi Robert! </div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Nice :) Not exactly &quot;Mixed Mode Assemblies&quot; though, because the<br>

really interesting part (calling unmanaged code w/out having to<br>
go through p/invoke) remains the same pain.<br>
<br></blockquote><div><br></div><div>Absolutely - I&#39;ve been thinking a lot about that direction, and I think you&#39;d probably need to write/extend a compiler to do it properly/efficiently.  What I&#39;ve made is just a wrapper around the Mono embedding API, exposing classes as symbols in a shared object.</div>
<div><br></div><div>To properly build a mixed-mode assembly, I guess you&#39;d have to have a compiler that was aware of it - I think.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

Out of curiosity: How are you handling more than one of those<br>
&quot;mixed assemblies&quot; in the same process? Is there a function<br>
inside libmono that can be used to detect an already initialized<br>
runtime?<br></blockquote><div><br></div><div>An interesting question - because I was just pondering that myself.  Answer is, I haven&#39;t thought about it yet and so haven&#39;t tackled the problem.  I am hacking away at it just now, so eventually I&#39;ll come across the issue!</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
On the generated stubs: are you using thunks or mono_runtime_invoke?<br>
Are you rewriting the signature of the stubs to be HRESULT-like<br>
(to be able to catch/detect managed exceptions)?<br></blockquote><div><br></div><div>I&#39;m using mono_method_get_unmanaged_thunk, and at the moment if any exception was raised (by use of the exception output parameter in the thunk), it just gets re-thrown in situ, and hence not handled by the calling code.  What I&#39;ve done is make GCC put the stubs into their own linker section that&#39;s writable (so as to make it possible to patch the stubs at runtime), and to this end, I&#39;d like to re-write the entire stub on first call, after it&#39;s gotten the unmanaged thunk, to directly call the function pointer, thus reducing the overhead of the stub.</div>
<div><br></div><div>It&#39;s an interesting problem to tackle, because you need to provide this exception to the calling code somehow, but I&#39;m trying to limit the amount of information exposed to the callers, as I wanted it to be as close to native as possible.  So,the stubs, at the moment, are just direct copies of the managed method signatures (plus a *this parameter for instance methods).</div>
<div><br></div><div>Let me see if I can get the code uploaded somewhere.</div><div><br></div><div>Oh, and another interesting problem to solve is that of multi-threading, firstly as you need to call mono_thread_attach when using threads and the embedding API, and secondly race conditions between initialising the runtime and calling other functions.  It may have to be some kind of terrible lock, or something.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><font class="Apple-style-span" color="#888888">Robert</font></blockquote></div><br>
<div>-- Tom</div>