在项目中引用相同的程序集时,无法使用Activator启动对象

时间:2014-12-19 13:10:15

标签: c# plugins reference activator

我最近遇到了一个奇怪的情况,我不明白,并请你的某个人形容我做错了什么或我在这里错过了什么。

解决方案是从3个项目构建的(一些代码部分已被删除以使其更具可读性):

项目1 - 主要

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();

有人能告诉我我错过了什么或者不明白? 为什么以这种方式工作?

1 个答案:

答案 0 :(得分:0)

当您向项目添加程序集引用时,它会将程序集的依赖关系构建到可执行文件中,这会导致程序集在运行时加载到执行上下文中。

由于实际上是将两个相同的程序集加载到执行上下文中(一次是通过程序集引用手动使用LoadFrom),因此应根据具体情况检查LoadFrom的行为。如果你正在做我认为你正在做的事情,那就是从“插件”文件夹加载程序集,那么LoadFrom将开始在你想要实现的目标方面做错。

在MSDN上阅读具体内容:http://msdn.microsoft.com/en-us/library/1009fa28(v=vs.110).aspx