从C#2.0中的dll获取Namespace,classname

bal*_*aji 4 c# reflection namespaces classname

我会动态地获取dll.我需要加载dll并获取名称空间,类名以调用方法(方法名称为static,它将始终为"OnStart()").基本上我需要通过加载dll来运行一个方法.有人可以帮忙!!!

ang*_*son 12

要加载程序集,您可以这样做:

Assembly assembly = Assembly.LoadFile(@"test.dll");
Run Code Online (Sandbox Code Playgroud)

假设您将磁盘上的程序集作为文件.如果你不这样做,就像如果你从一个数据库作为一个字节数组得到他们,还有对其他方法大会,这将有助于你给你加载它后Assembly对象.

要遍历程序集中的所有类,您将执行以下操作:

Assembly assembly = Assembly.LoadFile(@"test.dll");
foreach (Type type in assembly.GetTypes())
{
    if (type.IsClass)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

要查找OnStart静态方法,您可以这样做:

Assembly assembly = Assembly.LoadFile(@"test.dll");
foreach (Type type in assembly.GetTypes())
{
    if (type.IsClass)
    {
        MethodInfo method = type.GetMethod("OnStart",
            BindingFlags.Static | BindingFlags.Public);
        if (method != null)
        {
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

要调用该方法,您可以这样做:

Assembly assembly = Assembly.LoadFile(@"test.dll");
foreach (Type type in assembly.GetTypes())
{
    if (type.IsClass)
    {
        MethodInfo method = type.GetMethod("OnStart",
            BindingFlags.Static | BindingFlags.Public);
        if (method != null)
        {
            method.Invoke(null, new Object[0]); // assumes no parameters
            break; // no need to look for more methods, unless you got multiple?
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果需要将参数传递给方法,则可以将它们放在对象数组中:

Object[] arguments = new Object[] { arg1, arg2, arg3 ... };
method.Invoke(null, arguments);
Run Code Online (Sandbox Code Playgroud)

通过使用Linq为我们找到方法,可以将上面的代码折叠到以下代码:

Assembly assembly = Assembly.LoadFile(@"test.dll");
var method = (from type in assembly.GetTypes()
              where type.IsClass
              let onStartMethod = type.GetMethod("OnStart",
                  BindingFlags.Static | BindingFlags.Public)
              where onStartMethod != null
              select onStartMethod).FirstOrDefault();
if (method != null)
{
    method.Invoke(null, new Object[0]); // assumes no parameters
}
Run Code Online (Sandbox Code Playgroud)


rsl*_*ite 0

检查这里:http://dotnetguts.blogspot.com/2008/12/reflection-in-c-list-of-class-name.html

这里调用一个方法:http://www.csharphelp.com/archives/archive200.html

如果您在这些链接中搜索更多术语,您会发现更多信息。