[Mono-dev] Edit and Continue / Function body rewrite
David Srbecky
dsrbecky at gmail.com
Fri Jul 7 18:38:53 EDT 2006
Hello,
Here is a longer description of how I want to make the basic Edit and
Continue work. My questions are at the end.
Microsoft's .NET runtime will run the modifiable application and the IDE
with debugger (SharpDevelop).
Mono will be used to do the System.Reflection.Emit stuff - compile the
application for the first time (gmcs) and then to generate the IL code
updates.
I will need to use some communication between the runtimes - eg network
connection. Here is how I imagine the communication could work:
1) MS -> Mono: "Complie program Foo to assembly Foo.exe"
2) Mono -> MS: "Compilation successful. 0 errors"
3) MS executes Foo.exe
4) MS -> Mono: "Change function Main to '{return 1;}'"
5) Mono -> MS: "The new IL code is ..........."
6) MS applies the the new IL code
I have managed to get 1-3 working without any problems. I have also
managed to change a running program under MS runtime by handwriting the
new IL code.
Now I need to patch Mono's System.Reflection.Emit so that I can use it
to easily produce the new IL code and metadata. (I do not think that I
can get all I need from Microsoft's System.Reflection.Emit and I want to
use Mono's System.Reflection.Emit anyway because I am told that gmcs
likes it more)
Right now, I am just investing whether the Edit and Continue is
possible. If it is, may plan is to:
A) Define 'update' format - probably XML document
B) Modify SharpDevelop so that it can take the update and apply it to
the running program
C) Make it possible to produce 'updates' with Mono's
System.Reflection.Emit - the format of data it produces does not matter
- I just need to be able to collect it and then convert it to the XML
D) Make a simple sample application that uses Mono's
System.Reflection.Emit to create the XML 'update'
E) Change gmcs so that after whole compilation it can take source code
for body of a single method and generate 'update' using Mono's
System.Reflection.Emit
F) Modify SharpDevelop so that it can work with symbols produced by gmcs
I handle A, B, D and F myself. I would really appreciate your help with
C and E. I had a few long discussions about the gmcs with Marek Safar
and I hope he could help me with that.
So back to patching System.Reflection.Emit:
If I want to change a function in a running program, what do I need?
- whole IL code of the new function
- new TypeRef and MemberRef rows in metadata (if new external functions
are called)
- String heap (if new string is used in function)
- Anything else???
How can I get these from Mono's System.Reflection.Emit? Is there
actually any patching necessary or can I get these already?
Thank you very much,
David Srbecky
More information about the Mono-devel-list
mailing list