所以我在运行时加载程序集,我也使用泛型,具体取决于程序集类型。为了获得正确的类型,每个DLL都实现了一个工厂,我期望在那里使用正确的泛型类型实例化类。
Type factoryType = assembly.GetType("MyCompany.ScenarioPlayer.PlayerFactory");
MethodInfo method = factoryType.GetMethod("CreatePlayer", BindingFlags.Public | BindingFlags.Static);
player = (IScenarioPlayer)method.Invoke(null, null);
当我没有管理权限时,此代码在method.Invoke上失败。这是正确的,任何对MethodInfo.Invoke的调用我使用它的方式需要管理员吗?我下载了我的DLL代码,它甚至没有通过这个调用进入工厂。
编辑:结果表明存在一个未考虑的目标DLL的依赖项。我确实喜欢提出的MEF框架理念。
答案 0 :(得分:3)
使用反射,就像你使用它一样,解决在运行时创建工厂的问题是一个坏主意。你不仅不避免耦合(你有一个引用单一类型的硬编码字符串),你开辟了一个受伤的世界。这些东西都不是强类型的。
如果您要创建可插拔组件,我建议您查看MEF之类的内容。它已经解决了你所面临的问题和以更好,更快,更易维护的方式解决它。
答案 1 :(得分:2)
这与MethodInfo没有任何关系,而是与MethodInfo最有可能做的事情有关。您可以通过调用相关方法并查看它是否在非管理员环境中运行来测试它。