覆盖NuGet解决方案的DLL对核心库

时间:2018-03-10 03:53:51

标签: c# .net dependencies .net-assembly

我正在开发一个Windows C#.NET 4.5程序,该程序利用几个NuGet项目来减少我需要编写的代码量(为什么要重新发明轮子?)。无论出于何种原因,其中一个NuGet项目的依赖性会覆盖我程序中其他地方使用的MSCORLIB方法之一。

ReSharper警告我模糊的引用(我无法明显编译),我不能为我的生活弄清楚如何指定{Nuver]项目依赖关系使用MSCORLIB的方法。我花了几个小时谷歌搜索和阅读不同的东西,但找不到解决方案。

我的程序中含有模糊引用错误 的部分 以任何方式依赖于NuGet包的依赖关系,所以如果我能够实现的话MSCORLIB这个方法就在这个地方,我将是金色的。

这甚至可能吗?我尝试使用ReSharper"使用此程序集明确地将MSCORLIB的引用添加到项目中..."但是选择其中一个不起作用,以及Visual Studio中的“引用”选项卡。

1 个答案:

答案 0 :(得分:1)

您可以使用程序集别名和extern alias来解决此问题。要解决此问题,您需要手动编辑项目.csproj文件。

如果您正在使用packages.config,请在.csproj文件中查找与引入冲突类型的项目对应的<Reference>元素,并为其指定别名。

<Reference Include="bouncy_castle_hmac_sha_pcl, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
  <HintPath>..\packages\BouncyCastle-PCL.1.0.0.6\lib\bouncy_castle_hmac_sha_pcl.dll</HintPath>
  <Aliases>bouncy_castle</Aliases>
</Reference>

如果您使用的是PackageReference,则不会有直接的<Reference>元素,因此您需要添加一个目标来分配此值。

<Target Name="AssignAliasesToAssemblies" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
  <ItemGroup>
    <ReferencePath Condition="'%(FileName)' == 'bouncy_castle_hmac_sha_pcl'">
      <Aliases>bouncy_castle</Aliases>
    </ReferencePath>
  </ItemGroup>
</Target>

然后,您可以重新加载项目。在C#中,将extern alias bouncy_castle;添加到文件顶部。这将指示编译器如何消除两种类型之间的歧义。

extern alias bouncy_castle;
using System.Security.Cryptography;

namespace ClassLibrary2
{
    public class Class1
    {
        public HMACSHA1 Algorithm { get; }
        public bouncy_castle::System.Security.Cryptography.HMACSHA1 TheOtherOne { get; }
    }
}

顺便说一下,请看这个问题:https://github.com/NuGet/Home/issues/4989