Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将外部别名与nuget一起使用_C#_Nuget - Fatal编程技术网

C# 如何将外部别名与nuget一起使用

C# 如何将外部别名与nuget一起使用,c#,nuget,C#,Nuget,我在项目中使用extern别名,因此需要将引用别名从global更改为其他名称。问题是,如果使用Nuget添加引用,则每次更新包时,别名都会恢复为global。有没有办法阻止这种情况发生?这是不可能的,因为在nuget update之后,它会删除以前的程序集并添加一个新程序集,以便删除具有别名的程序集。。。因此,您必须再次将别名添加到新更新的程序集。您可以向NuGet软件包添加别名。但是包的使用者将无法选择不添加别名。下面是一些可以在脚本中使用的代码。我不是powershell最棒的,所以可能有

我在项目中使用
extern别名
,因此需要将引用别名从
global
更改为其他名称。问题是,如果使用Nuget添加引用,则每次更新包时,别名都会恢复为
global
。有没有办法阻止这种情况发生?

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

您可以向NuGet软件包添加别名。但是包的使用者将无法选择不添加别名。下面是一些可以在脚本中使用的代码。我不是powershell最棒的,所以可能有更好的方法:)


这是nuget参考的已知问题;在程序集别名完全不受支持的情况下(目前):

幸运的是,存在变通办法;您可以将特殊目标添加到csproj中,以便动态分配别名:

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

核心系统图

感谢csproj目标更改程序集引用的别名

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

错误CS0433:类型“DataServiceContext”在这两个数据库中都存在 'Microsoft.Data.Services.Client,版本=5.8.3.0,区域性=中性, PublicKeyToken=31bf3856ad364e35'和'System.Data.Services.Client, 版本=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>

遗产

有没有办法使这一过程自动化?您可以阅读更多关于。。这可能会有所帮助。考虑到这个问题,这可能是显而易见的,但您可以使用
extern alias CoreCompatSystemDrawing最重要的是你的.cs文件中的所有用法。你救了我;这正是我遇到问题的图书馆。谢谢。现在从NuGet 5.7开始支持它:
  <!--
  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>