我有哪些选项可以动态访问另一个程序集中的类?
本文关键字:程序集 程序 另一个 集中 访问 动态 选项 | 更新日期: 2023-09-27 18:12:17
我有一个ASP。NET MVC应用程序和一个需要写入web的插件。配置文件。由于各种原因,我发现最合适的方法是在编译过程中使用MSBuild配置,所以我创建了一个可执行文件,与我的插件一起分发,在这里使用适当的参数来解决消费者-应用程序依赖关系,如配置文件的路径。
插件是可配置的,它的定义必须在消费者应用程序的特定类中。
现在插件可执行文件必须能够读取这个类,但我们不能有任何硬编码的依赖,因为插件应该是可分发的,并在许多不同的应用程序中使用。
我在这里找到了关于动态加载/卸载dll的答案,我的问题是,如果这是使用方法,同时将相关参数作为参数传递给exe,或者我有任何其他选择吗?
答案是肯定的,但是你可以用两种不同的方法来做。
如果你想卸载类,是的,你需要创建一个新的AppDomain,使用它并卸载它,要做到这一点,你需要一个实现MarshalByRefObject
的类,这要复杂得多。
如果类可以在客户端应用程序的生命周期内存在,你只需要将插件加载到当前的AppDomain。
AppDomain.CurrentDomain.CreateInstanceAndUnwrap(assemblyName, typeName);
我强烈建议你正在加载的实例实现一个特定的接口,这样你就可以检查一个文件夹的DLL,像这样
var ass = Assembly.LoadFrom(path);
ass.DefinedTypes.Where(t => t.ImplementedInterfaces
.Any(i => i.AssemblyQualifiedName ==
typeof(<Defined Interface>).AssemblyQualifiedName))
这将返回实现你的接口的类型列表,所以你只需要使用上面的代码来创建一个实例。
我认为要与msbuild一起工作,你需要采取第一种方法,在实现MarshalByRefObject
的类中完成所有的加载卸载和使用,不要引用我的话