基本上问题是我想在一个未引用的程序集中调用一个方法,但似乎无法找到实例化该类的正确调用。我尝试过像返回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。
答案 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, ...);
}