2

我正在尝试动态加载 .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 类代码中的任何内容都会导致这种异常吗?

4

2 回答 2

9

您正在尝试做的事情:

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

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

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

于 2011-08-21T08:13:53.877 回答
5

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

消息非常清楚:“无法创建抽象类”。

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

当你使用反射时,你应该仔细考虑你想要什么——因为当你在做一些无意义的事情时,编译器将无法发现。如果没有反射,它本来可以:

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

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

于 2011-08-21T08:09:16.247 回答