当项目中引用同一程序集时,无法使用激活器启动对象
本文关键字:激活 对象 启动 引用 项目 程序集 | 更新日期: 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