我试图在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日
.NET目前有两个构建“系统”。一个是原始项目文件,导入Microsoft.Common.props
和Microsoft.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
步骤。