Silverlight 4 - Type.GetType()不适用于程序集

时间:2010-11-29 17:02:35

标签: silverlight assemblies instantiation

基本上问题是我想在一个未引用的程序集中调用一个方法,但似乎无法找到实例化该类的正确调用。我尝试过像返回null的简单Type t = Type.GetType("MyApp.Helper")和抛出安全异常的Assembly.LoadFrom("MyApp.Helper")

在下面的示例中,两个项目/程序集(Helper.dll和Menu.dll)分别编译为常用的“libs”文件夹,但不互相引用。 Main.dll引用两者,并且引用在VS中设置为“Copy local”。因此,当应用程序运行时,Main.xap应包含所有三个程序集,并且应将它们加载到同一应用程序域中。或者是我的理解。这是一个不可能的任务吗?我看到很多关于插件的评论,但到目前为止我还没有看到这个特定设计的例子。例如,我想我可以做一些像Jeff Prosise描述的here,但我宁愿将所有东西放在一个包中。

这是我的代码草图:

在一个项目/集会中,我有一个工人阶级:

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, ...);
        }
    }
}

最后,我有主要的app程序集:

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!");
        }
    }
}

感谢您的任何想法!

-Chris。

2 个答案:

答案 0 :(得分:1)

您需要获取Assembly对象,然后调用其GetType方法。

但是,我不明白为什么你要使用反射。
您可以从主项目中正常调用该方法。

答案 1 :(得分:0)

首先,您应该注意,因为它是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, ...);
    }