Я пытаюсь загрузить тип из другой сборки (неизвестной во время сборки) в качестве "dynamic" и выполнить метод для этого типа. Моя цель - полностью отключить "плагин" от родительского приложения, так что нет требования для какого-либо общего кода или общего типа интерфейса. Интерфейс подразумевается с помощью ожидаемой сигнатуры метода на загруженном типе.
Это работает:
dynamic myObj = Assembly.Load("MyAssembly").CreateInstance("MyType");
myObj.Execute();
Однако это будет загружать этот тип в текущий AppDomain вместе со всеми его зависимыми сборками. Я хочу изменить это, чтобы позволить мне делать то же самое в отдельном AppDomain.
Это работает, но не использует динамическое ключевое слово, мне нужно знать явный тип, который я создаю, чтобы вызвать метод Execute:
var appDomain = AppDomain.CreateDomain(domainName, evidence, setup);
var myObj = appDomain.CreateInstanceAndUnwrap(assembly, type);
typeof(IMyInterface).InvokeMember("Execute", BindingFlags.InvokeMethod, null, myObj);
Это по существу мой целевой случай, и я пытался заставить что-то вроде этого работать:
dynamic myObj = ad.CreateInstanceAndUnwrap(assembly, type);
myObj.Execute();
Я продолжаю заканчивать RuntimeBinderException с сообщением "System.MarshalByRefObject" не содержит определения для "Execute" ". Это сообщение имеет смысл, конечно, оно не содержит определения для "Execute", но я знаю, что тип, который я создаю, действительно содержит метод "Execute". Я предполагаю, что здесь что-то происходит с прозрачным прокси-сервером, который мешает этому работать, но я не уверен, что.
Мой фактический класс, который я пытаюсь создать, выглядит следующим образом:
[Serializable]
public class MyClass : MarshalByRefObject {
public void Execute() {
// do something
}
}
Я также пробовал это с помощью общего интерфейса (не моя главная цель, но я сначала пытаюсь понять это), чтобы он выглядел так:
[Serializable]
public class MyClass : MarshalByRefObject, IPlugin {
public void Execute() {
// do something
}
}
Где IPlugin является известным типом в родительском приложении, и плагин имеет соответствующую ссылку во время сборки, но это тоже не работает.
Я предполагаю, что в этот момент невозможно загрузить тип как динамический по границе AppDomain.
Есть ли способ заставить это работать?