<div class="gmail_quote">On 10 July 2011 06:28, arkain <span dir="ltr">&lt;<a href="mailto:kingmph@gmail.com">kingmph@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
So it looks like you guys are saying that allowing mono to create mixed-mode<br>
assemblies is possible given the following constraints:<br>
<br>
1. The .NET metadata must always be found in a PE container.<br>
2. A mixed mode assembly must always be a native format library so as to<br>
allow native programs to load them.<br>
3. The PE container for the managed portion of the assembly should be<br>
contained as a resource of the native format library in a mixed mode<br>
assembly<br>
4. The mixed-mode assembly should also load the necessary mono assemblies<br>
when loaded from a native application.<br>
<br>
With so many of you marking this as an &quot;interesting exercise&quot;, is there any<br>
chance that this to date missing feature will find its way into a near<br>
future release?</blockquote><div><br></div><div>Hi Guys - if you&#39;re still watching this thread,</div><div><br></div><div>So I may have done something brilliant - or something terrible.  I don&#39;t quite know yet - I need your feedback to see if I&#39;m heading along the right lines.</div>
<div><br></div><div>What I&#39;ve done is to create a tool that creates a shared library with an embedded PE assembly inside.  The shared library exports symbols that pertain to methods of the assembly, and when you link against this shared library, in a native application, you can then call those methods, without having to bother with using Mono&#39;s embedding API.</div>
<div><br></div><div>Essentially, a bunch of method stubs are created that when called ensure the runtime is initialised, the assembly loaded (from inside the shared library) and then locate and call the appropriate method.  After the runtime has been loaded, the first few bytes of the method are overwritten with NOPs to ensure the runtime isn&#39;t loaded twice.</div>
<div><br></div><div>The symbols exposed take the form of &#39;Namespace_Class_MethodName&#39;, which just works for static methods, but to call instance methods, you construct the class with a call to a &#39;new_Namespace_Class&#39; function, then pass in the object instance as the first member.</div>
<div><br></div><div>At the moment, the Makefile is more automated than the code generator, but if this seems like a worthwhile direction to head in, let me know and you can give me some feedback on my (rudimentary) implementation.</div>
<div><br></div><div>Anyone interested at all? Or am I barking mad^H^H^Hup the wrong tree?</div><div> </div></div>-- Tom.<br>