Используйте Reflection, чтобы получить только определенные методы внутри DLL - PullRequest
0 голосов
/ 17 октября 2019

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

Не удалось загрузить файл или сборку 'MyDLL.dll' или одну из ее зависимостей,Указанное имя сборки или кодовая база недопустимы. (Исключение из HRESULT: 0x80131047)

Не уверен, что мне нужно сделать, чтобы это исправить. Может кто-нибудь помочь с этим?

Task.Factory.StartNew((Action)delegate
{
    try
    {
        int count = 1;
        Assembly assembly = Assembly.LoadFrom("MyDLL.dll");

        foreach (Type type in assembly.GetTypes())
        {
            if (type.IsClass == true)
            {
                MethodInfo[] methodInfo = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

                foreach (MethodInfo mi in methodInfo)
                {
                    // MyTests is the class object in MyDLL.
                    var instance = Activator.CreateInstance(@"MyDLL.dll", "MyTests"); // Error here
                    TestResult test = (TestResult)mi.Invoke(instance, null);
                    SendTestResult(test, false);

                    if (ct.IsCancellationRequested)
                    {
                        break;
                    }

                    Thread.Sleep(5);
                    count++;
                }
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
});

1 Ответ

0 голосов
/ 17 октября 2019

Просмотрите документацию для Activator.CreateInstance(string assemblyName, string typeName):

assemblyName может быть одним из следующих:
1. Простое имя сборки без еепуть или расширение файла. Например, вы должны указать TypeExtensions для сборки, путь и имя которой. \ Bin \ TypeExtensions.dll.
2. Полное имя подписанной сборки, состоящее из ее простого имени, версии, культуры и открытого ключа. лексем;например, "TypeExtensions, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = 181869f2f7435b51".

Вы хотите, чтобы первый аргумент был "MyDLL".

Также вы будетенужно вызвать Unwrap для возвращенного ObjectHandle, чтобы использовать его с отражением таким образом. Вам лучше использовать перегрузку Activator.CreateInstance(Type type), так как у вас уже есть тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...