A CURSORY AND LIKELY MISLEADING GUIDE TO MONOCONNECT
General Architecture
--------------------
The goal of this code is to provide a two-way bridge between the
CLR/.NET/Mono/C#/etc. world and XPCOM.
We want:
- Natural C#/etc. syntax for consumers.
- Acceptable performance (wrapper space and call speed)
- "Correctness" (maintenance of object identity, reference management).
- Dynamic, lazy generation of stubs and interfaces from interface-info.
We do not want:
- People distributing generated stubs.
To that end, we register for TypeResolve and AssemblyResolve events on
our AppDomain (components.cs, RegisterAppDomainHooks). When user code
references an interface or stub-proxy that we have not yet generated
(and is not special-cased, like nsISupports), our TypeResolve hook
triggers the generation of an appropriate class.
The generation of proxy classes happens in generate-proxy.cs, where we
employ the many wonders of System.Reflection.Emit to create a proxy
for the indicated interface. The proxy class for a given interface
will have specialized marshalling code emitted for the specific
interface parameters and index. There is currently virtually no code
shared between proxy methods, which is something that we should remedy
in the future: a rough census of Mozilla interfaces (circa 1.6)
indicates that generating a static helper method or delegate per
unique method signature would give us significant savings.
typeinfo.cs has a bunch of infrastructure for inspecting interface
info from the IIM. I am not particularly proud of any of that
infrastructure, but it does get the job done at present. Lots of it
is likely not even used today, since it largely predates actual proxy
generation. xptinvoke.cs is along the same lines.
(typeinfo.cpp exists mainly because we need C-linkage entry points for
P/Invoke, and secondarily because I wanted to reduce mono<->C thunking
as much as was easy.)
wrapped-clr.cs is where the CLR-implementing-XPCOM-interfaces code
should go. Today, it basically...who am I kidding? You can see the
source, it clearly does almost nothing. I have fantasies about
patching the C++ vtable with JITted delegate pointers.
There's one piece missing to this puzzle (other than all the other
pieces): we need to generate metadata-only interface assemblies for
people to compile C# against, because our TypeResolve/AssemblyResolve
tricks are not enough to get us wired into the compiler.
tools/generate-interfaces.cs is that tool, mostly.
Other things that are missing:
- AString support
- Exceptions
- figuring out a good way to map casting to QI
- a component loader