.net - .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 当然是被调用插件使用的附加库。有什么我错过的吗?
解决方案
本教程使用自定义 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包,插件加载没有错误。
推荐阅读
- angular - 运行 ng new myapp 后将路由选项 No 更改为 Yes 的正确方法
- python - 在特定列(熊猫)中将值从底部行覆盖/移动到上部行
- python-3.x - apache2错误上的Python3.8 Flask wsgi:“致命的Python错误:...没有名为'encodings'的模块”
- javascript - Javascript:将天数转换为年、月和日
- jsf - jsf在编辑时在输入中显示实体的值
- python - 使按钮执行脚本
- python - 溢出 x 标签 MatPlotLib
- javascript - 还有其他方法可以检测外部点击吗?
- routes - 带有 react-router-config 的子路由
- java - 如何确定哪个测试挂起?