приложение плагина, дающее ошибку приведения - PullRequest
2 голосов
/ 01 января 2012

Я создал консольное приложение, которое ищет плагины , заканчивающиеся PlugIn.dll.Он загружает сборку DLL и выполняет метод записи для plugInClass в PlugIn.dll.Я создал интерфейс под названием IWrite, который включает метод записи.После выполнения консольного приложения оно выдает ошибку, как указано ниже:

Невозможно привести объект типа 'HPlugIn.plugInClass' к типу 'ConsolePlugIn.IWrite'.

Вот мой код для консольного приложения. [Главное приложение]

using System;
using System.IO;
using System.Reflection;
namespace ConsolePlugIn
{
    interface IWrite
    {
        void write();
    }
    class Program
    {
        static void Main(string[] args)
        {
            foreach (string s in Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*PlugIn.dll"))//getting plugins in base directory
            {
                Assembly aWrite = Assembly.LoadFrom(s);
                Type tWrite = aWrite.GetType("HPlugIn.plugInClass");
                IWrite click = (IWrite)Activator.CreateInstance(tWrite);//giving casting error
                click.write();
            }
        } 
    }
}

Вот мой код для DLL-файла плагина

using System;
namespace HPlugIn
{
    interface IWrite
    {
        void write();
    }
    public class plugInClass : IWrite
    {
      public  void write()
        {
            Console.Write("High from plugInClass");
        }
    }
}

Любая идея дляэто ошибка приведения?Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 01 января 2012

Вы определили интерфейс IWrite дважды в 2 разных сборках. Они считаются разными типами, и вы не можете разыгрывать их от одного к другому. Лучший способ добиться более слабой связи между EXE и сборкой - определить этот интерфейс в отдельной DLL. Затем пусть плагин и исполняемый файл ссылаются на эту третью сборку, содержащую контракт (интерфейс IWrite).

1 голос
/ 01 января 2012

Существует два разных интерфейса IWrite.Один в консольном приложении и один в DLL.Есть два способа обойти это.

  • Сделайте dll ссылкой на консольное приложение, и plugInClass реализует интерфейс ConsolePlugIn.IWrite.
  • Используйте ключевое слово dynamic длясделать интерфейсы одинаковыми.
1 голос
/ 01 января 2012

Интерфейсы IWrite в EXE и DLL не одинаковы, хотя их структуры идентичны. Вам нужно сделать третью DLL с интерфейсом и поделиться ею между DLL и EXE.

Общие:

namespace Shared {
    interface IWrite {
        void write();
    }
}

DLL:

using System;
using Shared;
namespace HPlugIn {
    public class plugInClass : IWrite {
        public  void write() {
            Console.Write("High from plugInClass");
        }
    }
}

EXE:

using System;
using System.IO;
using System.Reflection;
using Shared;
namespace ConsolePlugIn {
    class Program {
        ...
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...