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

时间:2019-03-14 21:46:36

标签: c# nuget lazy-loading mef

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

吉里

1 个答案:

答案 0 :(得分:0)

.NET当前具有两个构建“系统”。其中一个是原始项目文件,该文件导入Microsoft.Common.propsMicrosoft.CSharp.targets(假设它是ac#项目)以及之间的许多XML,这显然是.NET自2002年首次发布以来就存在的。自.NET Core于2016年普遍可用以来,由于msbuild xml中的*proj文件references the build system is though an Sdk element or attribute的方式,出现了一个新的项目系统,通常称为SDK项目。尽管这是题外话,但由于存在一个普遍的错误假设,我想指出的是,尽管为.NET Core创建了SDK项目,但是您可以从SDK项目中定位.NET Framework。

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

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