Invoke methods using System.Reflection

本文介绍了.NET中利用System.Reflection从程序集调用方法的相关内容。先说明了必要的Using语句,接着阐述开始前需明确要调用的方法信息,之后介绍打开程序集、设置绑定标志,通过循环检查程序集并调用方法,少量代码即可增强应用适应性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Introduction

.NET provides mechnisms 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.

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

Necassary Using statements

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

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 easy with System.Reflection too. But now we assume having all the knowlegde 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:

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 necassary for the instanciation of the chosen type.

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 instanciated 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.

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 you applications.

About André Janus


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.

Click here to view André Janus's online profile.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值