是否可以引用解决方案中存在的项目,如果不在.NET Core中,可以使用NuGet程序包引用作为后备吗?

时间:2019-06-22 18:59:04

标签: c# asp.net-core .net-core csproj

我有一个.NET Standard项目,在其中我实现了ASP.NET Core CMS框架的模块。当前,它使用来自NuGet包的CMS框架库。如果我从GitHub上获取CMS框架的源代码并将模块添加到其解决方案中,然后将包引用替换为实际的项目引用,那么它将正常工作。

我的目标是在不更新csproj文件中的引用的情况下使其正常工作,因此,如果将项目添加到完整的源代码解决方案中,则使用项目引用,否则使用NuGet包引用。

因此,假设.NET Standard项目称为“ ModuleA”。它具有对“ ModuleB”的软件包引用:

<ItemGroup>
  <PackageReference Include="ModuleB" Version="1.0.0" />
</ItemGroup>

当我想在可访问ModuleB的解决方案中使用ModuleA时,我使用对其的项目引用:

<ItemGroup>
  <ProjectReference Include="..\..\ModuleB\ModuleB.csproj" />
</ItemGroup>

我想将它们都包含在.csproj文件中,并使其在构建时使用正确的引用(例如,基于某些类似项目的条件?)。

如果将两者都添加到csproj中,则构建将失败(例如“无法找到项目... ModuleB.csproj。请检查项目引用是否有效以及该项目文件是否存在。”)。

2 个答案:

答案 0 :(得分:3)

您可以动态地执行此操作,但是我认为它的工作原理并不能完全透明。

我建议添加一个配置,例如在我的示例“ Local-Debug”中,并在csproj中使用条件。

示例

创建配置:

enter image description here

enter image description here

在csproj中,您可以执行以下操作:

<ItemGroup>
  <ProjectReference Condition="'$(Configuration)' == 'Local-Debug'" Include="otherProject.csproj" />
  <PackageReference Condition="'$(Configuration)' != 'Local-Debug'" Include="otherProjectPackage" Version="2.4.1" />
</ItemGroup>

答案 1 :(得分:0)

您的依赖项必须是静态已知的,并且在构建时可以解析。请参阅@Julian的答案,以获取由配置驱动的良好构建时解决方案。

作为运行时解决方案:您可以在运行时动态加载引用。这样,您可以在应用程序的工作目录中搜索所需的DLL,如果找不到该DLL,则可以将其下载为二进制文件(可以直接加载,也可以从Nuget或其他位置)下载。您可以建立的资源;然后动态加载该库。

以下是在运行时动态加载程序集的方法:https://docs.microsoft.com/en-us/dotnet/api/system.reflection.assembly.loadfrom?view=netframework-4.8

这个问题:Loading library dynamically

对动态加载的程序集进行编码有其自身的特点;您将需要为引用的库提供清晰的接口定义,否则,您将发现自己处理了许多reflectiondynamic