gpt4 book ai didi

.Net 核心和插件

转载 作者:行者123 更新时间:2023-12-02 02:59:56 27 4
gpt4 key购买 nike

在这次讲座 ( 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com