【问题标题】:The extern alias 'xxx' was not specified in a /reference option/reference 选项中未指定外部别名“xxx”
【发布时间】:2010-03-23 18:38:18
【问题描述】:

不幸的是,我有两个程序集在同一个命名空间中定义了相同的类型。我正在尝试使用extern alias 来解决这个问题。在 Visual Studio IDE 中,我已将引用的“别名”属性设置为我的别名。这应该将 C# 编译器命令行更改为如下所示:

/reference:MyAlias=MyAssembly.dll

但它实际上并没有这样做。 Visual Studio IDE 似乎只是忽略了引用上的 Aliases 属性设置。因此,当我在 C# 代码文件的顶部添加 extern alias MyAlias; 行时,我收到错误消息,即编译器的 /reference 选项中未指定别名。我无法弄清楚我做错了什么。有什么想法吗?

【问题讨论】:

  • 请发布构建输出(尤其是运行 Csc.exe 的行)。
  • 它实际上是 VS2008 但是的,这也是我的结论。
  • 构建输出可以在stackoverflow.com/questions/2503232/…的另一个问题中看到。我现在相信这些问题是相关的。构建失败,因为第一行编译器不包含别名。

标签: c# .net


【解决方案1】:

我有同样的问题,我能够重现该问题。

事实证明,在包含 xaml 文件的项目上会忽略引用别名,这些文件对输出程序集有 xmlns 定义,例如 xmlns:local='clr-namespace:TestProject'。

如果您认为这也是您的情况,请在 Microsoft Connect 上为我的bug report 投票。

编辑: 上面的链接中有一个建议的解决方法,需要手动编辑项目文件。为了使它起作用,我必须给出程序集的完整路径。将以下说明添加到项目文件的末尾:

<Target Name="solveAliasProblem" >
<ItemGroup>
 <ReferencePath Remove="FullPath.dll"/>
 <ReferencePath Include="FullPath.dll">
    <Aliases>ourAlias</Aliases>
 </ReferencePath>
</ItemGroup>
</Target>
<PropertyGroup>
    <CoreCompileDependsOn>solveAliasProblem;$(PrepareResourcesDependsOn)</CoreCompileDependsOn>
</PropertyGroup>

【讨论】:

  • 我尝试了上面的代码并以这个新错误结束 - 无法加载文件或程序集 '[AliasName]' 或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。
  • 我遇到的问题是我输入了一个别名然后点击离开,我没有意识到它没有保存。我必须单击属性窗口中的另一个字段才能提交它。
【解决方案2】:

Brian,我遇到了和你一样的问题,我想出了如何解决它。

我会和你做同样的事情:

  1. 使用属性窗口将程序集的别名从“global”更改为“MyAlias”
  2. 在使用别名程序集的文件顶部,放置 extern alias MyAlias。这必须在任何 using 语句之前。
  3. 使用别名前缀来使用您想要的命名空间,例如使用 MyAlias::MyNamespace。

我仍然会得到错误。在搞砸了一点之后,我发现修复它的方法是将引用的 dll 设置为您正在使用的解决方案之外的 dll。一旦我这样做了,我们都看到的错误消息就消失了,我能够继续从事我的项目。

希望对您有所帮助,祝您编码愉快!

【讨论】:

    【解决方案3】:

    更新: 这是一个错误。它将在 .Net 4.5 中修复。

    正如在Microsoft Connect bug report 上看到的那样。

    【讨论】:

    • 此链接现已失效:-(
    • 在 .net 4.6.2 中仍然存在错误
    【解决方案4】:

    使用以下步骤在 VS2008 中为我工作:

    1. 使用属性窗口将程序集的别名从“global”更改为“MyAlias”
    2. 在使用别名程序集的文件顶部,输入extern alias MyAlias这必须在任何 using 语句之前
    3. 使用别名前缀来使用你想要的命名空间,例如using MyAlias::MyNamespace

    【讨论】:

    • 在 VS2010 中工作对我来说很好。可能已在 SP1 中修复。
    • 但对我来说没有运气仍然得到错误“外部别名未在 /reference 选项中指定”
    【解决方案5】:

    如果您安装 .Net Framework 4.5,它会将您的 MSBuild 更新为 Microsoft (R) Build Engine version 4.0.30319.17929,从而为我的团队解决了这个问题。

    下载.Net Framework 4.5:
    http://www.microsoft.com/en-us/download/details.aspx?id=30653

    【讨论】:

      【解决方案6】:

      我遇到了完全相同的问题,看起来当您清理解决方案并构建项目时,MSBuild 第一次忽略引用并给出错误(可能是它还没有使用指定的引用构建一些程序集),但是在第二次尝试构建,它的工作原理。

      【讨论】:

        【解决方案7】:

        我遇到了同样的问题,通过以下操作解决了。

        转到存在冲突的程序集的属性窗口,并将 Aliases 属性从“全局”更改为“X”(X - 您的别名)

        希望这会有所帮助。

        【讨论】:

          【解决方案8】:

          将项目的目标框架设置为.NET 4.5.1

          【讨论】:

            【解决方案9】:

            我的项目也有同样的问题,但上述解决方案不起作用我的项目文件看起来像

                <Reference Include="AntiXSSLibrary" Condition="'$(TargetFrameworkVersion)' == 'v4.0' or '$(TargetFrameworkVersion)' == 'v4.5'">
              <HintPath>..\Dependencies\Third-party\.net 4\AntiXSSLibrary.dll</HintPath>
              <Aliases>antixss</Aliases>
            </Reference>
            <Reference Include="AntiXssLibrary">
              <HintPath>..\..\lib\myproject\AntiXssLibrary.dll</HintPath>     
            </Reference>
            

            添加实际项目 dll 工作的别名。所以

                <Reference Include="AntiXSSLibrary" Condition="'$(TargetFrameworkVersion)' == 'v4.0' or '$(TargetFrameworkVersion)' == 'v4.5'">
              <HintPath>..\Dependencies\Third-party\.net 4\AntiXSSLibrary.dll</HintPath>
              <Aliases>antixss</Aliases>
            </Reference>
            <Reference Include="AntiXssLibrary">
              <HintPath>..\..\lib\myproject\AntiXssLibrary.dll</HintPath>
              <Aliases>antixss</Aliases>
            </Reference>
            

            【讨论】:

              【解决方案10】:

              我遇到了同样的问题,我终于发现 .csproj 文件的目标版本是 4.5,而我遇到问题的 dll 是针对 4.5.2。

              我将 .csproj 文件目标版本更改为 4.5.2 并成功构建。

              【讨论】:

                【解决方案11】:

                orcun 建议的解决方案略有不同:

                手动将此添加到项目csproj文件中:

                  <Target Name="ChangeAliasesOfStrongNameAssemblies" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
                    <ItemGroup>
                      <!-- Use the file name, no need to specify the full path. -->
                      <ReferencePath Condition="'%(FileName)' == 'StackExchange.Redis.StrongName'">
                        <!-- Give the desired alias to the file here -->
                        <Aliases>myAlias</Aliases>
                      </ReferencePath>
                    </ItemGroup>
                  </Target>
                

                然后,您可以通过在 using 列表顶部添加别名来使用它:

                extern alias myAlias;
                ...
                var test = new myAlias::Fully.Qualified.NameSpace();
                

                顺便说一句,这个适用于References 和PackageReferences!

                在这里找到解决方案:https://github.com/NuGet/Home/issues/4989#issuecomment-311042085

                【讨论】:

                  【解决方案12】:

                  我们的 Build 代理在 .net core 3.1 应用程序中遇到了这个问题。通过在构建代理上安装 .net 5.0 sdk 来修复它,它升级了构建引擎版本并且可以正常工作。

                  【讨论】:

                    【解决方案13】:

                    我也遇到了同样的问题,只有把目标版本改成4.6.1才能解决。版本 4、4.5、4.5.1 或 4.6 没有帮助。

                    【讨论】:

                      【解决方案14】:

                      请检查您的项目目标框架版本。必须是同一个版本。

                      我更改了相同的版本解决了这个问题。

                      enter image description here

                      【讨论】:

                        【解决方案15】:

                        如果我的项目路径包含“=”符号,则在安装一些 NUget 包后会遇到同样的问题。 我有一个像“D:\=Projects...”这样的目录,重命名它解决了这个问题。

                        【讨论】:

                          【解决方案16】:

                          使用核心 3.1 和 VS 16.10.4:

                          <Project Sdk="Microsoft.NET.Sdk.Web">
                          
                            <PropertyGroup>
                              <TargetFramework>netcoreapp3.1</TargetFramework>
                              <RuntimeIdentifier>win-x64</RuntimeIdentifier>
                              <OutputType>Exe</OutputType>
                            </PropertyGroup>
                          
                            <ItemGroup>
                              <PackageReference Include="Hl7.Fhir.STU3" Version="3.4.0">
                                <Aliases>Stu3</Aliases>
                              </PackageReference>
                              <PackageReference Include="Hl7.Fhir.R4" Version="3.4.0">
                                <Aliases>R4</Aliases>
                              </PackageReference>
                            </ItemGroup>
                          
                            <ItemGroup>
                              <TransitivePackageReference Include="Hl7.Fhir.STU3.Core" Alias="STU3" />
                              <TransitivePackageReference Include="Hl7.Fhir.R4.Core" Alias="R4" />
                            </ItemGroup>
                          
                          </Project>
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2016-11-19
                            • 2016-05-03
                            • 1970-01-01
                            • 2021-10-18
                            • 1970-01-01
                            相关资源
                            最近更新 更多