我正在开发一个Windows C#.NET 4.5程序,该程序利用几个NuGet项目来减少我需要编写的代码量(为什么要重新发明轮子?)。无论出于何种原因,其中一个NuGet项目的依赖性会覆盖我程序中其他地方使用的MSCORLIB
方法之一。
ReSharper警告我模糊的引用(我无法明显编译),我不能为我的生活弄清楚如何指定{Nuver]项目依赖关系使用MSCORLIB
的方法。我花了几个小时谷歌搜索和阅读不同的东西,但找不到解决方案。
我的程序中含有模糊引用错误 的部分 以任何方式依赖于NuGet包的依赖关系,所以如果我能够实现的话MSCORLIB
这个方法就在这个地方,我将是金色的。
这甚至可能吗?我尝试使用ReSharper"使用此程序集明确地将MSCORLIB
的引用添加到项目中..."但是选择其中一个不起作用,以及Visual Studio中的“引用”选项卡。
答案 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