我正在尝试动态加载.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类代码中的任何内容都会导致这种异常吗?
答案 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();
当你使用反射时,你需要像编译器一样思考 - 因为编译器不能为你做这件事。