Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Передача интерфейса из dll в основное приложение

#c_sharp #aspnet #dll


Добрый день. Мне нужно из моей dll передать объект класса, реализующего такой интерфейс:

public interface IDataProvider
{
    void InitPhone();
    List GetPhone();
    string Print();
}


передать в мое основное приложение. В основном приложении я так же описал данный
интерфейс. В dll написан вот такой код который возвращает реализацию данного интерфейса:

public class CreateInstance
{
    public IDataProvider GetDataProvider()
    {
        IDataProvider provider = new DataProvider();
        return provider;
    }
}


А в основном приложении данная библиотека подключается при помощи assembly meneger
и вызывается, таким вот образом:

public class DataModuleInterface
{
    Object o;
    Type t;
    Assembly ass;
    public DataModuleInterface()
    {
        var binFolder = new DirectoryInfo(Path.Combine(@"C:\Users\Neoniklain\Source\Repos\KemSU_Shedule\Shedule\Shedule\Modules"));

        foreach (var file in binFolder.GetFileSystemInfos("*.dll", SearchOption.AllDirectories))
        {
            ass = AssemblyLoadContext.Default.LoadFromAssemblyPath(file.FullName);
            Type[] AssemlyResource = ass.GetExportedTypes();
            Type type= AssemlyResource[0];
            foreach (var item in AssemlyResource)
            {
                if(item.Name=="CreateInstance")
                {
                    t = ass.GetType(item.FullName);
                }
            }
            o = Activator.CreateInstance(t);
        }
    }

    public IDataProvider GetProvider()
    {
        MethodInfo m = ass.GetType(t.ToString()).GetMethod("GetDataProvider");
        IDataProvider res = (IDataProvider)m.Invoke(o, null);
        return res;
    }
}


Ошибка возникает вот в этом месте: 

IDataProvider res = (IDataProvider)m.Invoke(o, null);


И содержит следующий текст: 

System.InvalidCastException: 
"Unable to cast object of type 'Shedule.Module.DataModule.DataProvider' 
to type 'Shedule.Module.DataModule.IDataProvider'."


Здесь стоит сказать что hedule.Module.DataModule - это моя библиотека, из которой
я хочу получить тот самый злосчастный класс.
    


Ответы

Ответ 1



В основном приложении я так же описал данный интерфейс. У Вас определение интерфейса существует в двух местах, что для .NET означает два разных типа. Поместите тип интерфейса в третью библиотеку и ссылайтесь на нее из первых двух. P.S. А кто из присутствующих когда-нибудь получал такое сообщение об ошибке: Cannot assign TFont to TFont. ?

Комментариев нет:

Отправить комментарий