Currently showing entries with the tag: class

page 1 of 1
1 

Reflection on ASP.NET Auto-Compiled Classes

October 12, 2007 • 8:16AM • permalink
I came across a unique situation yesterday that took awhile to figure out, but I thought it was a really cool concept!

The basic idea is that I have an ASP.NET website that references a DLL. The DLL contains an interface that other classes can implement, with the general idea of allowing external classes (external to the DLL) to act as "plug-ins". The logical location to place these classes is in the App_Code folder, since it will auto-compile the classes and make them available globally, but that's when I ran into a problem...

The DLL also contains a static class to populate a static collection of the classes, so that they can be referenced by name. Since the classes act as "plug-ins", they should be able to be modified at any time, as well as allow for new classes to be dropped into the App_Code folder. The only way to deal with a situation like this is with Reflection.

So, I included a reference to System.Reflection and tried loading the type information for one using Type.GetType(). That failed miserably as the return value was null. I thought for a minute and then wrapped the class placed in App_Code in a unique namespace. I went back to my call to Type.GetType() and tried referencing the class using this namespace. Again, a NullReferenceException.

How did I get around this issue? The solution is actually VERY VERY simple! You just need to get a reference to the Assembly that the App_Code folder gets compiled into by using a call to Assembly.Load("App_Code"). After that, you can use the returned assembly reference in order to get the class type. So, if I have a class named AdamWidget in my App_Code folder that implements the IWidget interface from my DLL. The code in the foreign DLL to load a Type instance for that class could be:


Assembly asm = Assembly.Load("App_Code");
Type module_type = asm.GetType("AdamWidget");
if (module_type.GetInterface("IWidget") != null)
{
   DoSomething();
}




That's all there is to it! Now our web application can import (through the DLL) any class that implements IWidget in our App_Code folder!

Please also note that I discovered later that you can also reference the same dynamic assembly with a call to Assembly.Load("__code").





page 1 of 1
1 




Tags

concurrency Generics Microsoft Windows books lazy initialization syntax languages Erlang AnimeConPics testing driver Python ASP functional programming Generic Method query interface debug expert MySql Stopwatch protocol mathematics Demand Media Visual Basic server SQL Server Google client-side performance interview injection network Microsoft bitwise JSP c sharp dynamic block math Flash love shortcut c SQL Introduction operator programming module software AnimeDates