我最近遇到了一个奇怪的情况,我不明白,并请你的某个人形容我做错了什么或我在这里错过了什么。
解决方案是从3个项目构建的(一些代码部分已被删除以使其更具可读性):
namespace TestRun
{
class Program
{
static void Main(string[] args)
{
Assembly assembly = Assembly.LoadFrom(PluginPath);
foreach (Type type in assembly.GetTypes())
{
if (type.IsSubclassOf(Plugins.Plugin) &&
type.IsAbstract == false)
{
if(Parameters != null && Parameters.Length > 0)
Result = (T) Activator.CreateInstance(type, Parameters);
else
Result = (T) Activator.CreateInstance(type);
}
}
}
}
}
这个负责从给定文件夹(插件)加载所有带有dll扩展名的文件。
接下来我有一个主插件类:
namespace Plugins
{
public interface IPlugin
{
void func();
}
public abstract class Plugin : IPlugin
{
//Basic implementation
}
}
一个插件程序集:
namespace DevicePlugins
{
public class DevicePlugin : Plugins.Plugin
{
{...}
}
}
问题在于,如果Project 1具有对插件程序集(i.E. DevicePlugins)的引用,则它无法从此程序集(DevicePlugin)创建对象的实例。 我没有收到任何错误或异常 - 只有项目1中“结果”的信息 - “无法评估值”。 如果我从项目1中删除对插件程序集的引用(我的意思是在项目1中我没有引用DevicePlugins程序集),一切都像魅力(我可以从DevicePlugins程序集创建DevicePlugin的对象)。 此外,当我有参考时,我可以正常方式启动一个对象
DevicePlugins.DevicePlugin plug = new DevicePlugins.DevicePlugin();
有人能告诉我我错过了什么或者不明白? 为什么以这种方式工作?
答案 0 :(得分:0)
当您向项目添加程序集引用时,它会将程序集的依赖关系构建到可执行文件中,这会导致程序集在运行时加载到执行上下文中。
由于实际上是将两个相同的程序集加载到执行上下文中(一次是通过程序集引用手动使用LoadFrom
),因此应根据具体情况检查LoadFrom
的行为。如果你正在做我认为你正在做的事情,那就是从“插件”文件夹加载程序集,那么LoadFrom
将开始在你想要实现的目标方面做错。
在MSDN上阅读具体内容:http://msdn.microsoft.com/en-us/library/1009fa28(v=vs.110).aspx