Currently showing entries with the tag: reflection

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

Javascript AdSense interface JSP SQL SQL Server T-SQL mathematics languages assembly Windows internals reflection Win32 API Introduction Demand Media functional programming query API OS MySql SQL Server 2005 syntax debug client-side c sharp injection protocol software performance Generic Method c Remote Desktop parsing expert Flash help anime convention PHP script generation c plus plus testing Erlang string parsing bitwise PC hack csharp VB Mikomicon new site