当项目中引用同一程序集时,无法使用激活器启动对象

本文关键字:激活 对象 启动 引用 项目 程序集 | 更新日期: 2023-09-27 18:34:46

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

该解决方案是从 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
    {
      {...}
    }
}

问题是,如果项目 1 引用了插件程序集(即 DevicePlugins(,则它无法从该程序集(DevicePlugin(创建对象的实例。我没有收到任何错误或异常 - 只有有关项目 1 中"结果"的信息 - "无法评估值"。如果我从项目 1 中删除对插件程序集的引用(我的意思是在项目 1 中我没有对 DevicePlugins 程序集的引用(,一切都像魅力一样工作(我可以从设备插件程序集创建设备插件的对象(。此外,当我有引用时,我可以以正常方式启动一个对象

DevicePlugins.DevicePlugin plug = new DevicePlugins.DevicePlugin();

有人可以告诉我我错过或不明白什么吗?为什么它以这种方式工作?

当项目中引用同一程序集时,无法使用激活器启动对象

将程序集引用添加到项目时,它会将程序集的依赖项生成到可执行文件中,这会导致程序集在运行时加载到执行上下文中。

由于您实际上将同一程序集加载到执行上下文中两次(一次手动使用 LoadFrom,一次通过程序集引用(,因此您应该检查特定情况下LoadFrom的行为。如果您正在做我认为您正在做的事情,即从"插件"文件夹加载程序集,那么我相信LoadFrom将开始在您想要实现的目标方面表现不正确。

有关详细信息,请阅读 MSDN:http://msdn.microsoft.com/en-us/library/1009fa28(v=vs.110(.aspx