C # Activator.CreateInstance () отбрасывает исключение «Не удается создать абстрактный класс» - PullRequest
2 голосов
/ 21 августа 2011

Я пытаюсь динамически загрузить файл .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 ]

8 голосов
/ 21 августа 2011

Что вы пытаетесь сделать:

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

Это вызовет статический метод с object[] (theArguments), содержащий все аргументы метода

Другое решение - просто удалить ключевое слово static из класса и метод (который сделает ваш текущий код работоспособным)

5 голосов
/ 21 августа 2011

Вы пытаетесь создать экземпляр статического класса. Вы не можете этого сделать - у него нет конструкторов (статический класс является как абстрактным, так и запечатанным).

Сообщение довольно ясно об этом: «Не удается создать абстрактный класс».

Почему вы пытались создать экземпляр этого класса? Вы говорите, что хотите вызвать метод, но почему вы думаете, что для этого потребуется создать экземпляр? Даже если бы вы могли создать новый экземпляр, вам не следовало этого делать для вызова статического метода. Я предполагаю, что метод является статическим, иначе он не может быть помещен в статический класс ...

Вы должны тщательно продумать точно что вы хотите сделать, когда используете отражение - потому что компилятор не сможет определить, когда вы делаете что-то бессмысленное. Без размышления он мог бы:

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

Вам нужно думать как компилятор, когда вы используете отражение - потому что компилятор не может сделать это за вас.

...