首页 > 解决方案 > .Net 核心和插件

问题描述

在本次讲座(https://docs.microsoft.com/en-us/dotnet/core/tutorials/creating-app-with-plugin-support)之后,我设法创建了一个基于插件的应用程序。到目前为止,一切都很好。但是,我想用我的插件做更多的事情。因此,对于其中一个,我创建了一个额外的库。当然,在开发我的插件时,我对我创建的这个库有一个库依赖。问题更多在于执行。在运行我的应用程序时,尤其是在插件执行其任务时,我有一个异常提示:

Could not load file or assembly 'MyLibObjectsLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.

MyLibObjectsLib 当然是被调用插件使用的附加库。有什么我错过的吗?

标签: .netplugins.net-core

解决方案


本教程使用自定义 ALC (AssemblyLoadContext) 仅加载一个不依赖于其他插件程序集的插件程序集。

在您的情况下,自定义 ALC 加载插件并解决所有依赖项。

自定义 ALC中,您注意到它使用AssemblyDependencyResolver(.Net Core 3.0+ 中的新类)

AssemblyDependencyResolver 类使应用程序开发人员能够更轻松地结合自定义 System.Runtime.Loader.AssemblyLoadContext 实例开发插件架构,以隔离插件并启用插件加载依赖项。

重要说明:

插件应包括ExcludeAssets=runtime项目对共享程序集的引用 ref

例如,如果项目Common包含接口 `IContract' 并且被宿主应用程序和插件项目引用,则添加引用,如下所示:

<!-- in the plugin project -->

<ItemGroup>
        <ProjectReference Include="..\IContract\Common.csproj">
            <Private>false</Private>
            <ExcludeAssets>runtime</ExcludeAssets>
        </ProjectReference>
        <ProjectReference Include="..\MyLibObjectsLib\MyLibObjectsLib.csproj" />
    </ItemGroup>

此代码用于加载插件:

string pluginPath = @"path/to/MyContract.Plugin.dll";           
var assembly = new PluginLoadContext(pluginPath).LoadFromAssemblyPath(pluginPath);

var type = assembly.GetTypes()
       .FirstOrDefault(t => t.IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract);     

if (type != null) {
     var instance = (IContract)Activator.CreateInstance(type);
     var ret = instance.Execute();     
}

我将您的插件模拟为standard2.0库,插件参考OLEDB nuget包,插件加载没有错误。


推荐阅读