首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在运行时加载程序集并创建类实例?

如何在运行时加载程序集并创建类实例?
EN

Stack Overflow用户
提问于 2009-11-26 21:00:36
回答 3查看 58.1K关注 0票数 20

我有个集会。在这个程序集中,我有一个类和一个接口。我需要在运行时加载这个程序集,并希望创建该类的一个对象,还希望使用该接口。

代码语言:javascript
复制
Assembly MyDALL = Assembly.Load("DALL"); // DALL is name of my dll
Type MyLoadClass = MyDALL.GetType("DALL.LoadClass"); // LoadClass is my class
object obj = Activator.CreateInstance(MyLoadClass);

这是我的代码。如何改进呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-26 22:11:40

如果您的程序集在GAC或bin中,请在类型名称的末尾使用程序集名称,而不是Assembly.Load()

代码语言:javascript
复制
object obj = Activator.CreateInstance(Type.GetType("DALL.LoadClass, DALL", true));
票数 19
EN

Stack Overflow用户

发布于 2009-11-27 04:57:56

你应该使用动态的方法来改进。它比反射更快..

下面是使用动态方法创建对象的示例代码。

代码语言:javascript
复制
public class ObjectCreateMethod
{
    delegate object MethodInvoker();
    MethodInvoker methodHandler = null;

    public ObjectCreateMethod(Type type)
    {
        CreateMethod(type.GetConstructor(Type.EmptyTypes));
    }

    public ObjectCreateMethod(ConstructorInfo target)
    {
        CreateMethod(target);
    }

    void CreateMethod(ConstructorInfo target)
    {
        DynamicMethod dynamic = new DynamicMethod(string.Empty,
                    typeof(object),
                    new Type[0],
                    target.DeclaringType);
        ILGenerator il = dynamic.GetILGenerator();
        il.DeclareLocal(target.DeclaringType);
        il.Emit(OpCodes.Newobj, target);
        il.Emit(OpCodes.Stloc_0);
        il.Emit(OpCodes.Ldloc_0);
        il.Emit(OpCodes.Ret);

        methodHandler = (MethodInvoker)dynamic.CreateDelegate(typeof(MethodInvoker));
    }

    public object CreateInstance()
    {
        return methodHandler();
    }
}

//Use Above class for Object Creation.
ObjectCreateMethod inv = new ObjectCreateMethod(type); //Specify Type
Object obj= inv.CreateInstance();

这种方法只需要Activator所需时间的1/10。

查看http://www.ozcandegirmenci.com/post/2008/02/Create-object-instances-Faster-than-Reflection.aspx

票数 13
EN

Stack Overflow用户

发布于 2013-05-25 06:13:54

查看http://www.youtube.com/watch?v=x-KK7bmo1AM,修改他的代码以加载多个程序集

代码语言:javascript
复制
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            string assemblyName = args.Name.Split(',').First();
            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("YourNamespace." + assemblyName + ".dll"))
            {
                byte[] assemblyData = new byte[stream.Length];
                stream.Read(assemblyData, 0, assemblyData.Length);
                return Assembly.Load(assemblyData);
            }
        }

在你的main方法中放入

代码语言:javascript
复制
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

请确保将程序集添加到项目中,并将生成操作属性更改为"Embedded Resource“。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1803540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档