首页 > 解决方案 > 将外部程序集加载到新的应用程序域并调用“基类”的方法

问题描述

我是 .NET 远程处理的新手(我相信这与此有关)。

假设主应用程序引用了一个类库A,其中包含一个带有抽象方法的抽象类。

现在,假设我们创建一个全新的项目B并引用相同的 DLL A,创建一个继承抽象类并实现该方法的新类。

是否可以将这个新程序集加载到主应用程序中的新应用程序域中并创建一个只知道基类类型的实例?

或者,还有更好的方法?我在这里考虑某种插件系统。

编辑:对于反射,我们可以找到继承基类的类型,然后使用 (BaseClass)Activator.CreateInstance(ParentType); 无需知道ParentType

标签: c#.netreflectionremoting

解决方案


当然可以。这从具有派生自 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;
    }
}

此示例只是一个快速而肮脏的解决方案,具有限制,例如您的类应该具有要实例化的无参数构造函数。但是您可以将其用作起点。

编辑:我使用和接口,但它也适用于抽象类


推荐阅读