Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C# (http://www.go4expert.com/forums/c-sharp/)
-   -   Dynamic Assembly Loading (http://www.go4expert.com/forums/dynamic-assembly-loading-t10119/)

Huggz 18Apr2008 21:29

Dynamic Assembly Loading
 
I'm trying to extend my CMS with a plugin interface to make extensibility a little easier to manage. I created 2 classes: an abstract base class (baseModule) containing a single abstract method Init() and a class that inherits from it (TestModule) and throws an exception when Init is called. In my Engine, I'm doing the following:

Code:

            if (!module_dir.Exists) throw new Exception("Modules directory does not exist.");
            foreach (FileInfo f in module_dir.GetFiles("*.dll"))
            {
                Type t = Assembly.LoadFile(f.FullName).GetType();
                baseModule m = Activator.CreateInstance(t) as baseModule;
                if (m == null)
                {
                    throw new Exception("dll is not of type IModule");
                }
                module_list.Add(m);
            }

Unfortunately when I hit Activator.CreateInstance, I get the error :

"No parameterless constructor defined for this object."

Any ideas what I'm doing wrong?

excavator 25Apr2008 17:21

Re: Dynamic Assembly Loading
 
Quote:

Originally Posted by Huggz
I'm trying to extend my CMS with a plugin interface to make extensibility a little easier to manage. I created 2 classes: an abstract base class (baseModule) containing a single abstract method Init() and a class that inherits from it (TestModule) and throws an exception when Init is called. In my Engine, I'm doing the following:

Code:

            if (!module_dir.Exists) throw new Exception("Modules directory does not exist.");
            foreach (FileInfo f in module_dir.GetFiles("*.dll"))
            {
                Type t = Assembly.LoadFile(f.FullName).GetType();
                baseModule m = Activator.CreateInstance(t) as baseModule;
                if (m == null)
                {
                    throw new Exception("dll is not of type IModule");
                }
                module_list.Add(m);
            }

Unfortunately when I hit Activator.CreateInstance, I get the error :

"No parameterless constructor defined for this object."

Any ideas what I'm doing wrong?

it seems that the variable t refer to "System.Reflection.Assembly" not to the dll you want to instantiate. below is a simple sample code about dynamic loading, you need to modify it to fit in your application.

Code:

private void LoadAssembly()
        {
            Assembly a = Assembly.LoadFile(filename);
            System.Type[] sts = a.GetTypes();
            foreach (System.Type st in sts)
            {
                Object o = Activator.CreateInstance(st);
                if (o != null)
                {
                    Console.WriteLine(st.FullName + " Instantiated\n");
                    //proceed with type conversion here
                }
                else
                {
                    Console.WriteLine(st.FullName + " NOT Instantiated\n");
                }
            }                       
        }

hope this help


All times are GMT +5.5. The time now is 13:59.