В основном проблема в том, что я хотел бы вызвать метод в несвязанной сборке, но, похоже, не могу найти правильный вызов для создания экземпляра класса. Я пробовал такие вещи, как простой Type t = Type.GetType("MyApp.Helper")
, который возвращает ноль, и Assembly.LoadFrom("MyApp.Helper")
, который выдает исключение безопасности.
В приведенном ниже примере два проекта / сборки (Helper.dll и Menu.dll) скомпилированы отдельно в общую папку 'libs', но не ссылаются друг на друга. Main.dll ссылается на оба, и ссылки установлены на «Копировать локальный» в VS. Поэтому, когда приложение запускается, Main.xap должен содержать все три сборки, и они должны быть загружены в один и тот же домен приложения. Или так мое понимание. Это невозможный квест? Я вижу много комментариев относительно плагинов, но пока я не видел примеров для этого конкретного дизайна. Например, я полагаю, что мог бы сделать что-то, как Джефф Просиз описывает здесь , но я бы предпочел, чтобы все было в одной упаковке.
Вот набросок моего кода:
В одном проекте / сборке у меня есть рабочий класс:
namespace MyApp.Helper {
public class Helper {
public void ShowHelp() {
Console.Write("Help!");
}
}
}
В другом проекте / сборке у меня есть класс меню, который пытается вызвать помощника:
namespace MyApp.Menu {
public class Selector {
public void InvokeSelection(string className, string functionName) {
// fails: t will be null
Type t = Type.GetType(className);
// fails: t will be null
t = Type.GetType(string.Format("{0}.{1}, {0}, Version=1.0.0.0, Culture=\"\", PublicTokenKey=null", "MyApp.Helper", "Helper"));
// however, this works (reference to main assembly?)
t = Type.GetType(string.Format("{0}.{1}, {0}, Version=1.0.0.0, Culture=\"\", PublicTokenKey=null", "MyApp.Main", "Worker"));
// and, I'd like to do something like the following
// t.InvokeMember(functionName, ...);
}
}
}
Наконец, у меня есть основная сборка приложения:
namespace MyApp.Main {
public class Main {
public static void Main() {
MyApp.Menu.Selector sel = new Menu.Selector();
sel.InvokeSelection("MyApp.Help.Helper", "ShowHelp"); // fails
sel.InvokeSelection("MyApp.Main.Main", "Worker"); // works in some cases
}
public void Worker() {
Console.Write("Work!");
}
}
}
Спасибо за любые идеи!
-Крис.