如何使用nuget使用extern别名

时间:2015-11-01 09:09:25

标签: c# nuget

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

4 个答案:

答案 0 :(得分:16)

这是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>

答案 1 :(得分:2)

感谢csproj Target更改程序集引用的别名。

我用它来修复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,Culture = neutral,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>

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以在NuGet包中添加install script以添加别名。但是该软件包的消费者将无法选择不添加别名。这是您可以在脚本中使用的一些代码。我不是PowerShell中最伟大的,因此可能有更好的方法:)

# Standard Install.ps1 parameter list
param($installPath, $toolsPath, $package, $project)

# Name of the alias
$alias = 'MyAlias'

# Load the Microsoft.Build assembly to be able to access MS Build types
Add-Type -AssemblyName Microsoft.Build

# Load the csproj file
$projectObject = New-Object Microsoft.Build.Evaluation.Project($project.FullName)

# Search through the project items to find all references
$referenceItems = $projectObject.Items | where ItemType -eq "Reference" 

# Find the reference that matches the package id 
# (this assumes your assembly name matches your package id)
$item = $referenceItems | select @{Name='Reference'; Expression={$_}},@{Name='AssemblyName'; Expression={(New-Object System.Reflection.AssemblyName($_.UnevaluatedInclude)).Name}} | where AssemblyName -eq $package.Id | select Reference

# If the reference doesnt already have an alias, add one and save the project
if (($item.Reference.Metadata | where Name -eq 'Aliases') -eq $null) {
    $item.Reference.SetMetadataValue('Aliases', $alias)
    $projectObject.Save()
}

# Unload the project when done
$projectObject.ProjectCollection.UnloadAllProjects()