GLD*_*vid 2 .net plugins .net-core
在本次讲座(https://learn.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.
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
此代码用于加载插件:
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();
}
Run Code Online (Sandbox Code Playgroud)
我将您的插件模拟为standard2.0库,并且插件引用OLEDB nuget包,并且插件加载没有错误。
| 归档时间: |
|
| 查看次数: |
4524 次 |
| 最近记录: |