MEF 加载程序集中的 NuGet 依赖项

NuGet dependencies in MEF loaded assemblies

我正在尝试使用 C#.NET Core 编写一个可以使用 MEF 扩展的应用程序。目前,我能够在没有任何库问题的情况下做到这一点,这些库没有依赖关系或与主机应用程序具有相同的依赖关系(因此已经加载了依赖关系)。但是,如果我想使用带有 NuGet 引用的库,但主应用程序未使用该库,则该库的加载会在该引用上失败。

如果主应用试图加载具有此类引用的程序集,我如何强制它加载缺少的 NuGet 依赖项?在我看来,这是一个非常常见的用例,但我在这里迷路了,找不到出路。谢谢

为了参考,我发布了部分代码。

[ImportMany]
private IEnumerable<Lazy<IService, IServiceMetadata>> _asrServices;

...

var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog(Path.Combine(Directory.GetCurrentDirectory(), "Services")));          
CompositionContainer _container = new CompositionContainer(catalog);

...

foreach (Lazy<IService, IServiceMetadata> _service in _asrServices)
{
   var _serviceInstance = _service.Value // here the loading fails
}

智日

.NET 目前有两个版本 "systems"。一个是原始项目文件,导入 Microsoft.Common.propsMicrosoft.CSharp.targets(假设它是一个 c# 项目)以及中间的许多 XML,自 .NET 首次发布以来就一直存在,显然是在 2002 年。自从 .NET Core 在 2016 年普遍可用以来,出现了一个新的项目系统,通常称为 SDK 项目,因为 *proj 文件 references the build system is though an Sdk element or attribute 在 msbuild xml 中的方式。虽然这是题外话,因为有一个常见的错误假设,但我想指出,虽然 SDK 项目是为 .NET Core 创建的,但您可以从 SDK 项目中以 .NET Framework 为目标。

对于原始项目文件,当您构建时,所有项目引用都会复制到输出目录。然而,对于 SDK 项目,只有项目的程序集被复制到输出(我不确定,但我认为即使是设置为复制到输出的内容实际上也不会在构建时被复制)。为了将所有内容都放在一个目录中,您应该使用 dotnet cli's publish command.

因此,如果您有构建项目并将所有插件复制到某处的构建脚本,您应该使用 SDK 样式项目文件为每个插件添加一个 dotnet publish 步骤。