.Net 核心和插件

标签 .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.

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

最佳答案

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

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

custom ALC , 你注意到它使用了 AssemblyDependencyResolver (.Net Core 3.0+ 中的一个新类)

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

重要提示:

插件应包含 ExcludeAssets=runtime 以供项目引用共享程序集,ref .

例如,如果项目 Common 包含接口(interface)“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 包,插件加载没有错误。

关于.Net 核心和插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60209723/

相关文章:

java - 如何在 Eclipse 3.4.X 或更高版本中卸载插件

mysql - 在 WordPress 数据库站点中创建表时出现 500 错误

javascript - 从 NPAPI 插件返回一个整数/字符串到 JavaScript(不使用 FireBreath)

.net - 哪个更快 : Working from memory or lots of queries?

c# - 如何压缩zip文件中的多个文件

c# - 如何使用 Moq 为异步函数抛出异常

c# -/usr/share/dotnet/sdks/microsoft.docker.sdk/sdk/sdk.props 找不到

c# - 如何创建一个在所有意图和目的上都像字符串一样的类型,因为我无法从字符串继承

.net - 确定相对于目标的弹出位置

c# - .NET : How do you remove a specific node from an XMLDocument using XPATH?