C#Activator.CreateInstance()删除“无法创建抽象类”异常

时间:2011-08-21 08:04:23

标签: c# dll activator

我正在尝试动态加载.DLL文件并运行其中一个方法(实际上只有一个方法..)但Activator.CreateInstance方法删除了“无法创建抽象类”异常 这是我的代码:

Assembly assembly = Assembly.Load(DLLByteArray);
//Type typeToExecute = assembly.GetType("ClassLibrary1.Class1");
//last line was replaced with the next one to ensure that the name is correct.
Type typeToExecute = assembly.GetTypes()[0];
Object instance = Activator.CreateInstance(typeToExecute);
如果需要,

课程减速:“public static unsafe class Class1”。

.DLL类代码中的任何内容都会导致这种异常吗?

2 个答案:

答案 0 :(得分:8)

您要做的是:

Assembly assembly = Assembly.Load(DLLByteArray);
Type typeToExecute = assembly.GetTypes()[0];
typeToExecute.GetMethod("TheMethod").Invoke(null, theArguments);

这将使用包含所有方法参数的object[](theArguments)调用静态方法

另一个解决方案就是从类和方法中删除static关键字(这将使您当前的代码工作)

答案 1 :(得分:5)

您正在尝试创建静态类的实例。你不能这样做 - 它没有任何构造函数(静态类既抽象又密封)。

关于这一点的信息很清楚:“无法创建一个抽象类”。

为什么尝试创建此类的实例?你说你想调用一个方法,但为什么你认为这需要你创建一个实例?即使您可以创建新实例,也不应该这样做以调用 static 方法。我假设该方法是静态的,否则它不能放在静态类中......

当你使用反射时,你应该仔细考虑完全你想要做什么 - 因为当你做一些非感性的事情时,编译器无法发现。如果没有反思,它本可以:

// Fails at compile-time
new ClassLibrary1.Class1().WhateverMethod();

当你使用反射时,你需要像编译器一样思考 - 因为编译器不能为你做这件事。