@ATauenis

Как в C# пробросить интерфейс через dynamic?

Доброго времени суток! Пишу программу с плагинами. Все плагины это классы, реализующие интерфейс KrotAPI.IKrotPlugin. Пространство имён KrotAPI берётся из общего для всех проектов плагинов файла krotapi.cs. Этот же файл прикреплён к проекту хоста. Процедура загрузки плагина хостом такова:

dynamic LoadPlugin(Assembly asm)
		{
			foreach (Type type in asm.GetTypes())
			{
				if (type.GetInterface("KrotAPI.IKrotPlugin") != null)
				{
					PluginType = type;
					dynamic inst = Activator.CreateInstance(type);
					KrotAPI.IKrotPlugin inst2 = inst as KrotAPI.IKrotPlugin;
					if (inst2 == null) return inst;
					Console.WriteLine("Есть привязка к стандартному API.");
					return inst2;
				}
			}
			throw new Exception("Нет плагинов Крота в сборке.");
		}

Проблема в чём. Загрузить плагин удаётся только в переменную inst, в inst2 возвращается null несмотря на то, что Activator.CreateInstance(type) возвращает класс, наследующийся от KrotAPI.IKrotPlugin. Видимо CLR не нравится, что интерфейс класса находится в другой сборке, хоть и по исходникам он идентичен одноимённому интерфейсу из сборки хоста. Можно ли как-то переубедить CLR, что inst это KrotAPI.IKrotPlugin? Т.е. сделать утиную типизацию.

И второй вопрос, сразу. Если сие не по силам .NET Framework (4.0), то как сделать возможность обращения плагина к такой функции в хосте:
int HostEar(string Command, Dictionary<string, object> Arguments, out object Result)

? Если гнать через Delegate, то затыка идёт в передаче out, компилятор слово out не принимает, а без него возникает ошибка рантайма, мол, не найдена функция с таким количеством аргументов.

Делегат "статический" (delegate с маленькой буквы), отлично проходящий между классами внутри хоста, при передаче в плагин через метод либо свойство рушит хост с такими матюками:
Microsoft.CSharp.RuntimeBinder.RuntimeBinder
Internal Compiler Exception
An unexpected exception occurred while binding a dynamic operation

. То есть тоже утиная типизация не срабатывает, даже когда этот делегат я размещаю в krotapi.cs.
  • Вопрос задан
  • 497 просмотров
Решения вопроса 1
@ATauenis Автор вопроса
Решено путём статической линковки и хоста, и плагинов, со сборкой, содержащей интерфейс.
stackoverflow.com/questions/42376539/how-to-access...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@d-stream
Готовые решения - не подаю, но...
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы