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

问题描述 投票:0回答:1

我试图在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
}

J i日

c# nuget lazy-loading mef
1个回答
0
投票

.NET目前有两个构建“系统”。一个是原始项目文件,导入Microsoft.Common.propsMicrosoft.CSharp.targets(假设它是ac #project)和介于两者之间的大量XML,自从.NET首次发布以来,显然是在2002年。由于.NET Core一般可用在2016年有一个新的项目系统一般称为SDK项目,因为在msbuild xml中*proj文件references the build system is though an Sdk element or attribute的方式。虽然它是偏离主题的,因为有一个常见的错误假设,我想指出虽然SDK项目是为.NET Core创建的,但您可以从SDK项目中定位.NET Framework。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.