Click here to Skip to main content
15,888,968 members
Articles / Programming Languages / C#
Article

Run-Time Code Generation II: Invoke Methods using System.Reflection

Rate me:
Please Sign up or sign in to vote.
2.74/5 (18 votes)
18 Jan 2006CPOL1 min read 73.1K   370   34   10
Invoke methods using System.Reflection

Introduction

.NET provides mechanisms to compile source code and to use the generated assemblies within an application. Using these features, you can make applications more adaptive and more flexible.

This article shows how to invoke methods from an assembly using System.Reflection.

Necessary Using Statements

Before you start, add the following using statements to your application to ease the use of the namespaces:

C#
using System.Reflection;
using System.Security.Permissions; 

Getting Started

At the beginning, you have to know which method from which type and from which module you want to call. Inspecting an assembly can be done very easily with System.Reflection too. But now we assume having all the knowledge about it because we generated it ourselves like in Run-Time Code Generation Part I.

So we just set the module's name, the type's name and the method's name:

C#
string ModuleName = "TestAssembly.dll";
string TypeName = "TestClass";
string MethodName = "TestMethod";

Open an Assembly

Then you can open the assembly and set some Binding Flags, which are necessary for the instantiation of the chosen type:

C#
Assembly myAssembly = Assembly.LoadFrom(ModuleName);

BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public | 
  BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);

Invoke a Method

After that, three loops are used to inspect the assembly and get the chosen module/type/method combination. Within the last loop, the type is instantiated and the method is called. The method can be called with parameters, but here we choose null for methods with no parameters. There can also be a response from the method, which we put into a general object.

C#
Module [] myModules = myAssembly.GetModules();
foreach (Module Mo in myModules) 
    {
     if (Mo.Name == ModuleName) 
         {
         Type[] myTypes = Mo.GetTypes();
         foreach (Type Ty in myTypes)
             {
            if (Ty.Name == TypeName) 
                {
                MethodInfo[] myMethodInfo = Ty.GetMethods(flags);
                foreach(MethodInfo Mi in myMethodInfo)
                    {
                    if (Mi.Name == MethodName) 
                        {
                        Object obj = Activator.CreateInstance(Ty);
                        Object response = Mi.Invoke(obj, null);
                        }
                    }
                }
            }
        }
    }

Conclusion

With a few lines of code, you make your application call any method in any type from any module. In combination with code compilation, that is a powerful mechanism to enhance the adaptability of your applications.

References

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
Germany Germany
I am currently student at the university of Karlsruhe and working on my master thesis at the IT-Management and Web Engineering Research Group within the institute of telematics.

Comments and Discussions

 
QuestionWindows Form with TableLayoutPanel is changing its Controls position when is shown in mdiParent Form. How to Resolve this Issue? Pin
Nouman_gcu21-Dec-09 1:16
Nouman_gcu21-Dec-09 1:16 
I have Windows Form which is implemented as per singleton pattern and having TableLayoutPanel as container on it for other controls to be placed on it and it is generating an anonymous problem regarding controls movement in which they change their position when set as mdiChildForm of a mdiParent Form. In this scenario if a windows Form is not being implemented by singleton pattern then it is working fine and if not then the Controls like lable and others are changing their location when the form appear on screen inside mdiparent second time by the user. The further detail regarding this problem is described below.

There are two Forms named as UI-1 and UI-2 and one Is the MDIParent Form named as MainForm.

Form UI-1 has the singleton pattern implementation and can only be initialized by GetInstance() method as you can see from code given below.


The code In the UI-1 Form:

public partial class UI1 : Form
    {
        private static UI1 frm;
     
        public static UI1 GetInstance()
        {
            if (frm == null)
            {
                frm = new UI1();
            }
            return frm;
        }

        private UI1()
        {
            InitializeComponent();
        }

        public void ShowLabelCoordinates()
        {
            MessageBox.Show("Location: " + this.label1.Location.ToString() + " Position: "+ 
              this.label1.PointToScreen(this.label1.Location).ToString());
        }
    }



Form UI-2 is with its usual constructor and can be initialized directly from it as you can see from code given below.

public partial class UI2 : Form
    {
        public UI2()
        {
            InitializeComponent();
        }
    }


The code in the main Form which is actually a mdi Parent Form.

UI1 frm = UI1.GetInstance();
            frm.MdiParent = this;
            frm.Show();
            frm.Focus();
            frm.ShowLabelCoordinates();

UI2 frm = new UI2();
            frm.MdiParent = this;
            frm.Show();
            frm.Focus();


Sample Application has been attached at the link given below
http://www.eggheadcafe.com/fileupload/1355103023_mdiTestApp.zip


Any immediate assistance will be highly appreciated.

Muhammad Noman
GeneralReflection , Invoke Methods using System.Reflection Pin
Nouman_gcu29-Oct-09 3:40
Nouman_gcu29-Oct-09 3:40 
GeneralMy vote of 2 Pin
Behrooz_cs29-Jun-09 11:17
Behrooz_cs29-Jun-09 11:17 
QuestionWhat if... Pin
Member 22902784-Jun-08 23:07
Member 22902784-Jun-08 23:07 
GeneralGreat article!!. But ... Pin
SentCleef19-Apr-07 1:24
SentCleef19-Apr-07 1:24 
GeneralRe: Great article!!. But ... Pin
André Janus19-Apr-07 2:15
André Janus19-Apr-07 2:15 
GeneralTotally cool Pin
Mr. VB.NET3-Nov-06 13:13
Mr. VB.NET3-Nov-06 13:13 
GeneralMore Detail Pin
qwerty666@codeproject.com28-Dec-05 5:09
qwerty666@codeproject.com28-Dec-05 5:09 
GeneralRe: More Detail Pin
D1113-Jun-06 8:41
D1113-Jun-06 8:41 
GeneralRe: More Detail Pin
mabxsi18-Aug-06 4:42
mabxsi18-Aug-06 4:42 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.