Моя C # динамическая ссылка на DLL возвращает значение не может быть нулевым - PullRequest
0 голосов
/ 08 июля 2011

Я пытаюсь вызвать DLL, которую я создал, и хочу загрузить динамически.

Определение класса для DLL

namespace pqs.Utilities
{
    public class Transform
    {
        public string ImportXMLFile(string cFileSource, string VirtDir, string cFileXSLT, string cFileDest)
        {

Но когда я вызываю этот код ниже, я получаю Значение не может бытьноль.Имя параметра: введите, я не понимаю, почему ..

    string ClasstoInstantiate = "pqs.Utilities.pqs_util_Transform.Transform";
    Type classType = Type.GetType(ClasstoInstantiate);
    object o = Activator.CreateInstance(classType);
    string x;
    x= (string) classType.InvokeMember("ImportXMLFile",
     BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
     null, o, new object[]{"", "", "", ""});

Ответы [ 2 ]

4 голосов
/ 08 июля 2011

Type.GetType смотрит только в исполняющей сборке и сборке mscorlib. Он не знает о вашей pqs_util_Transform сборке. Вам необходимо передать имя типа, соответствующее сборке, например,

string classToInstantiate = "pqs.Utilities.Transform, pqs_util_Transform";
                                                    ^^^^^^^^^^^^^^^^^^^^

где pqs_util_Transform - это имя сборки (DLL), содержащей класс Transform. Обратите внимание, что имя DLL помещается после запятой, а не между пространством имен и именем класса, как вы, похоже, делаете в данный момент.

См. Type.AssemblyQualifiedName для получения дополнительной информации о формате имен, соответствующих сборке, особенно если вам нужно иметь дело с версиями, сборками GAC и т. Д.

0 голосов
/ 08 июля 2011

Я думаю, что вы должны сначала загрузить сборку динамически, используя метод Assembly.Load .Как только сборка будет загружена, вы сможете создать экземпляр своего класса.Кстати, похоже, переменная ClasstoInstantiate неверна.Разве это не должно быть значение "pqs.Utilities.Transform, assemblyName"?

...