繁体   English   中英

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当前有两个构建“系统”。 其中一个是原始项目文件,该文件导入了Microsoft.Common.propsMicrosoft.CSharp.targets (假定它是ac#项目)以及之间的许多XML,这显然是.NET自2002年首次发布以来就存在的。自.NET Core于2016年普遍可用以来,已经出现了一个新的项目系统,通常称为SDK项目,因为*proj文件引用构建系统的方式是通过 msbuild xml中的Sdk元素或属性 尽管它是题外话,但由于存在一个普遍的错误假设,我想指出的是,尽管SDK项目是为.NET Core创建的,但您可以从SDK项目中定位.NET Framework。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM