在/ reference选项中未指定extern别名'xxx'

时间:2010-03-23 18:38:19

标签: c# .net

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

/reference:MyAlias=MyAssembly.dll

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

16 个答案:

答案 0 :(得分:22)

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

事实证明,在包含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>

答案 1 :(得分:10)

布莱恩,我和你有同样的问题,我想出了如何解决它。

我会做同样的事情:

  1. 使用属性窗口将程序集的别名从“全局”更改为“MyAlias”
  2. 在使用别名程序集的文件顶部,输入extern别名MyAlias。这必须在任何使用声明之前。
  3. 使用别名前缀来使用您想要的命名空间,例如使用MyAlias :: MyNamespace。
  4. 我仍然会收到错误。在搞砸了一下后,我发现修复它的方法是将引用的dll设置为你正在使用的解决方案之外的dll。一旦我这样做,我们看到的错误消息就消失了,我能够继续我的项目。

    我希望有帮助,快乐的编码!

答案 2 :(得分:10)

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

Microsoft Connect bug report上所示。

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

如果您安装.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

答案 5 :(得分:2)

我有类似的问题,看起来就像清理解决方案并构建项目一样,MSBuild第一次忽略引用并给出错误(可能是它没有使用指定的引用构建一些程序集),但是第二次尝试构建,它的工作原理。

答案 6 :(得分:2)

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

转到包含冲突的程序集的属性窗口,并将Aliases属性从'global'更改为'X'(X - 您的别名)

希望这有帮助。

答案 7 :(得分:1)

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

答案 8 :(得分:1)

myproject有同样的问题,但上面的解决方案没有工作我的项目文件看起来像

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

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

CurrentProject.Connection.Execute sSQL

答案 9 :(得分:1)

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();

顺便说一句,这一个对ReferencePackageReference都适用!

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

答案 10 :(得分:1)

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

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

我遇到了同样的问题,只有当我将目标版本更改为4.6.1时才能解决它。版本4,4.5,4.5.1或4.6没有帮助。

答案 13 :(得分:0)

请检查您的Project Target框架版本。必须是相同版本。

我更改了同一版本,从而解决了该问题。

enter image description here

答案 14 :(得分:0)

如果我的项目路径包含“ =”符号,则在安装一些NUget软件包后出现相同的问题。 我有一个类似“ D:\ = Projects ...”的目录,并重命名解决了该问题。

答案 15 :(得分:0)

使用核心 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>