如何使用nuget使用extern别名

Eli*_*ock 9 c# nuget

extern alias在我的项目中使用,所以我需要将引用别名更改global为其他内容.问题是,如果我使用Nuget添加引用,每次更新包时别名都会恢复为global.有没有办法阻止这种情况发生?

Vit*_*nko 19

这是nuget引用的已知问题; 在汇编别名的情况下根本不支持别名:https://github.com/NuGet/Home/issues/4989

幸运的是,解决方法存在; 你可以在你的csproj中添加特殊目标,它将动态分配别名:

  <Target Name="ChangeAliasesOfNugetRefs" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
    <ItemGroup>
      <ReferencePath Condition="'%(FileName)' == 'CoreCompat.System.Drawing'">
        <Aliases>CoreCompatSystemDrawing</Aliases>
      </ReferencePath>
    </ItemGroup>
  </Target>
Run Code Online (Sandbox Code Playgroud)

  • 对于这个问题,这可能很明显,但是您可以在.cs文件中的所有用法之前,使用“外部别名CoreCompatSystemDrawing;”引用它。 (3认同)
  • 现在从 NuGet 5.7 开始支持:https://learn.microsoft.com/en-us/nuget/release-notes/nuget-5.7 (2认同)
  • 我希望我能投票 100000 次。这让我对一个旧项目感到抓狂 (2认同)

Bor*_*nov 13

从 NuGet 5.7 和 Visual Studio 2019 Update 7 开始,PackageReference现在支持Aliases属性. 没有UI,但可以直接编辑项目文件:

<ItemGroup>
    <PackageReference Include="NuGet.Versioning" Version="5.8.0" Aliases="ExampleAlias" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

然后在 C# 代码中:

extern alias ExampleAlias;

namespace PackageReferenceAliasesExample
{
...
        {
            var version = ExampleAlias.NuGet.Versioning.NuGetVersion.Parse("5.0.0");
            Console.WriteLine($"Version : {version}");
        }
...
}
Run Code Online (Sandbox Code Playgroud)


小智 5

感谢您提供用于更改程序集引用别名的 csproj 目标。

我用它来修复 System.Data.Services.Client/Microsoft.Data.Services.Client 冲突,如下所示:

错误CS0433:类型“DataServiceContext”存在于“Microsoft.Data.Services.Client,Version=5.8.3.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”和“System.Data.Services.Client,Version=4.0.0.0”中,文化=中立,PublicKeyToken=b77a5c561934e089'

解决办法是:

  <!--
  Avoid collision of older System.Data.Services.Client with newer Microsoft.Data.Services.Client
  when mixed due to PackageReferences
  -->
  <Target Name="ChangeAliasesOfNugetRefs" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
    <ItemGroup>
      <ReferencePath Condition="'%(FileName)' == 'System.Data.Services.Client'">
        <Aliases>legacy</Aliases>
      </ReferencePath>
    </ItemGroup>
  </Target>
Run Code Online (Sandbox Code Playgroud)


She*_*med 0

这是不可能的,因为在 nuget update 之后,它会删除以前的程序集并添加一个新程序集,因此它会删除带有别名的程序集...因此您必须再次将别名添加到新更新的程序集。