ARTICLE

Dynamically Loading an assembly at Runtime and calling its methods

Posted by Sridhar Subramanian Articles | Visual C# October 14, 2008
This article explains how to load an assembly dynamically and call its method.
Reader Level:

In this article, I would like to explain how to load an assembly dynamically and call one of its methods. Consider a situation where you want to call a method at runtime from a unknown assembly based on the user's input, this task can be acheived using reflection.

In the below example an assembly called "BusinessLogic" will be loaded at runtime, which can be determined programatically also.

UI
**
          
//Input parameters to be passed to the method
            object[] Parameternew object[1];
            Parameter[0]= textBox1.Text;

//Calling the method

           // Parameters Assembly Name, Class Name, Method Name, Parmateres as
 Array
           object obj = Process("BusinessLogic", "BankAccount", "GetBalance", Parameter);
            // Assign the result
            label2.Text = "Balance in your account is:" + Convert.ToString(obj);

Load Assembly
**** ********


/// <summary>
///
Call the asssembly dynamically and execute a method
///
/// </summary>
///
<param name="AssemblyName">Name of the Assembly to be loaded</param>
///
<param name="className">Name of the class to be intantiated </param>
///
<param name="methodName">Name of the method to be called</param>
///
<param name="parameterForTheMethod">Parameters should be passed as object array</param>
///
<returns>Returns as Generic object..</returns>

public static object Process(string AssemblyName, string className, string methodName, object[] parameterForTheMethod)
       
{
            object returnObject = null;
            MethodInfo mi = null;
            ConstructorInfo ci = null;
            object responder = null;
            Type type = null;
            System.Type[] objectTypes;
            int count = 0;
            try
            {
                //Load the assembly and get it's information
                type = System.Reflection.Assembly.LoadFrom(AssemblyName  +   .dll").GetType(AssemblyName +"." +
className);                                      
                //Get the Passed parameter types to find the method type
                objectTypes = new System.Type[parameterForTheMethod.GetUpperBound(0) + 1];
                foreach (object objectParameter in parameterForTheMethod)

                {
                    if (objectParameter != null)
                        objectTypes[count] = objectParameter.GetType();
                    count++;
                }

                //Get the reference of the method
                mi = type.GetMethod(methodName, objectTypes);
                ci = type.GetConstructor(Type.EmptyTypes);
                responder = ci.Invoke(null);
                //Invoke the method
                returnObject = mi.Invoke(responder, parameterForTheMethod);
            }
                catch (Exception ex)
            {
                throw ex;
            }
                finally
            {
                mi = null;
                ci = null;
                responder = null;
                type = null;
                objectTypes = null;
            }

//Return the value as a generic object
            return returnObject;

        }
    }

Business Logic
****** *****


//The below class resides in a assembly called BusinessLogic and
//this will be invoked through our dynamic assembly loader

namespace
BusinessLogic
{
    public class BankAccount
    {
        public int GetBalance(string AccountNumber)
        {
            //Fetching Account Balance
            Random r = new Random();
            int Balance = r.Next(100000);
            return Balance;
        }
    }
}

Please download the code for full working example.

COMMENT USING

Trending up