c# - 将外部程序集加载到新的应用程序域并调用“基类”的方法
问题描述
我是 .NET 远程处理的新手(我相信这与此有关)。
假设主应用程序引用了一个类库A,其中包含一个带有抽象方法的抽象类。
现在,假设我们创建一个全新的项目B并引用相同的 DLL A,创建一个继承抽象类并实现该方法的新类。
是否可以将这个新程序集加载到主应用程序中的新应用程序域中并创建一个只知道基类类型的实例?
或者,还有更好的方法?我在这里考虑某种插件系统。
编辑:对于反射,我们可以找到继承基类的类型,然后使用 (BaseClass)Activator.CreateInstance(ParentType); 无需知道ParentType。
解决方案
当然可以。这从具有派生自 IPlugin 的类型的外部程序集打印 2147483647。IPlugin 在您的主域中定义:
var asy = Assembly.LoadFrom("yourChildAssembly.dll");
List<Type> availablePlugIns = asy.GetTypes().Where(t => !t.IsAbstract && typeof(IPlugin).IsAssignableFrom(t)).ToList();
var myPluginType = availablePlugIns.FirstOrDefault();
if (myPluginType != null)
{
IPlugin pluginInstance = (IPlugin)System.Activator.CreateInstance(myPluginType);
pluginInstance.MyPluginMethod();
}
使用的样品类型:
public interface IPlugin
{
int MyPluginMethod();
}
public class MyPluginClass : IPlugin
{
public int MyPluginMethod()
{
return int.MaxValue;
}
}
此示例只是一个快速而肮脏的解决方案,具有限制,例如您的类应该具有要实例化的无参数构造函数。但是您可以将其用作起点。
编辑:我使用和接口,但它也适用于抽象类
推荐阅读
- mysql - MySQL 与 PostgreSQL 上的分片
- sql - 为什么我不断收到 INSERT 错误:目标多于表达式
- python-3.x - MaybeEncodingError:发送结果时出错:'
' - r - 如何使用军用时间来计算时间间隔
- python-3.x - 关于订单 Set List
- python - 如何在页面刷新后等待之前通过 Selenium 和 Python 呈现的元素
- dns - GCP 请求无法转发到对等网络,因为对等项目禁用了 DNS 对等互连
- python - 在 Django 中获取用户输入时遇到问题
- javascript - 从脚本标签中提取自定义属性(不使用数据)
- css - 从“figure”中的“a”元素到“p”元素的奇怪继承