[Mono-devel-list] Dynamically changing classes?

Jonathan Pryor jonpryor at vt.edu
Wed Sep 24 18:11:29 EDT 2003


Response inline...

On Wed, 2003-09-24 at 14:12, Thomas Sondergaard wrote:
> Can a .net class be changed at runtime? Can you add/remove methods and
> fields at runtime?

No.

> If one were to compile a dynamically typed language like Ruby or Python to
> IL and the classes were to be directly represented by .net classes and not
> .net objects this would be necessary.
> 
> I have been using the emit API but this just adds a new assembly either to
> memory or a file, so I don't see how I can use it to dynamically change
> existing types.

Well...  You be cute about it. :-)

For every change (added method, field) to a class, you actually create a
new derived object.  You determine the actual object to instantiate by
keeping the most-derived class name hanging around a well-known
location.

	class RuntimeInfo {
		public static string ActualClassName = "Something_2"
	}

	// at runtime...
	class Something_0 { ... }
	class Something_1 : Something_0 {...}
	class Something_2 : Something_1 {...}

Problem: it doesn't handle updating existing class instances.  Thus,
this may be unsuitable for some situations.

> In CIL you can call a virtual function. This, as far as I understand, is the
> limit to late binding as implemented in .net (without reflection). In ruby
> and Python the concept of sending messages to an object is more dynamic and
> has nothing to do with types. Using Type.InvokeMember you can mimic this
> behaviour on .net but could it is relatively slow. Why not add a new
> instruction to the CLR that is simply called e.g. 'send_msg'  that accepts a
> methodName string and a list of parameters? This would be essential for
> dynamically typed languages wouldn't it.

Why add a new CIL instruction, when you can just do it yourself?

	interface IDynamicLanguage {
		public object Invoke (string message, object[] args);
	}

Just have all your internal classes implement IDynamicLanguage, and you
get the same functionality as "send_msg".  There's no particular reason
why this has to be in CIL, as opposed to doing it yourself (above).

> Disclaimer: I don't really know much about this I'm just wondering what kind
> of platform support that is necessary if you want dynamically typed
> languages to execute more or less directly on the CLR, meaning that classes
> are represented by .net classes and not .net objects.

This is an open research question. :-)

The ways outlined above would work, but they're not necessarily the
*best* way to do it.  I'm not sure what the best way is, and I'm not
sure anyone else knows either, for that matter.

Thus, research and experimentation are required. :-)

 - Jon





More information about the Mono-devel-list mailing list