c# Проблема приведения интерфейса загрузки отраженной сборки в строгом имени - PullRequest
0 голосов
/ 29 марта 2020

Я выделил следующую проблему, которую я использую для распределенного измерения и интерпретации данных (когда impl знает, как обрабатывать данные и их UserControl, которого нет в примере, который представляет их).

У меня есть 3 различных проекта в решении: 1) интерфейс (отдельная dll)

namespace inter
{
    public interface IInter
    {
        byte[] results();
    }
}

2) реализующая класс (отдельная dll)

using inter;

namespace impl
{
    public class impl : IInter
    {
        public byte[] results()
        {//dummy data production
            return new byte[10].Select((ii, index) => (byte)index).ToArray();
        }
    }
}

3) программа, которая запускает проблему ...

using inter;
using impl;

namespace test_class_casting
{
    class Program
    {
        static void Main(string[] args)
        {
            var path = @"C:\Users\pavel\source\repos\test class casting\impl\bin\Debug\impl.dll";
            var b = File.ReadAllBytes(path);
            var assembly = Assembly.Load(b);

            IInter inst = null;
            var expTypes = assembly.GetExportedTypes();
            foreach (var d in assembly.GetExportedTypes())
            {
                var obj = Activator.CreateInstance(d);
                if (obj is IInter)
                {
                    inst = obj as IInter;
                    try
                    {
                        var res = inst.results();
                        continue;
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        Console.ReadKey();
                        Environment.Exit(0);
                    }
                }
            }

            try
            {
                var reType = (impl.impl)inst;// as impl.impl;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadKey();
                Environment.Exit(0);
            }

            Console.WriteLine("...");
            Console.ReadKey();
        }
    }
}

Проблема в том, что приведение типа reType завершится неудачно, поскольку [A] impl.impl не может быть приведен к [B] impl.impl. сообщению об исключении. Как сделать так, чтобы скрипт распознал, что оба типа классов совпадают. (Примечание. Я не могу связать ссылку с проектом, ответственность за реализацию классов impl несут пользователи, так что я даже не знаю их всех.

Я пытался даже добавить Сильные имена как к inter, так и к impl, но уже с прогрессом. У вас есть решение для этого?

1 Ответ

0 голосов
/ 31 марта 2020

Ведь после изучения некоторых сборок я нашел решение. Каждый раз, когда сборка загружается динамически, код может проверить, находится ли она уже в AppDomain.CurrentDomain.GetAssemblies () (проверка по свойству FullName). Т.е. если сборка ссылается на проект.

Если не существует, используется новая сборка и создаются экземпляры из ее GetExportedTypes ().

Если уже существует, то уже загруженная используется для создания экземпляров. Пример кода здесь https://www.dropbox.com/s/hbs0ndwh8cf3uq0/test%20class%20casting-resolved.zip?dl=0

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