Silverlight 4 - Type.GetType () не работает между сборками - PullRequest
1 голос
/ 29 ноября 2010

В основном проблема в том, что я хотел бы вызвать метод в несвязанной сборке, но, похоже, не могу найти правильный вызов для создания экземпляра класса. Я пробовал такие вещи, как простой 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!");
        }
    }
}

Спасибо за любые идеи!

-Крис.

Ответы [ 2 ]

1 голос
/ 29 ноября 2010

Вам нужно получить объект Assembly, а затем вызвать его метод GetType.

Однако я не понимаю, почему вы вообще используете Reflection.
Вы можете вызвать метод как обычно из вашего основного проекта.

0 голосов
/ 29 ноября 2010

Во-первых, вы должны заметить, что, поскольку это SL, вы не можете вызывать приватных / защищенных / внутренних членов.

Во-вторых, попробуйте это:

    public void InvokeSelection(string className, string functionName) {

        var asm = Assembly.Load("MyApp.Helper, Version=1.0.0.0, Culture=\"\", PublicTokenKey=null"); // double check this is correct!

        Type t = asm .GetType(className);  

        // and, I'd like to do something like the following
        // t.InvokeMember(functionName, ...);
    }
...