我有两个程序集,遗憾的是在同一名称空间中定义了相同的类型。我正在尝试使用extern alias
解决问题。在Visual Studio IDE中,我已将引用的“别名”属性设置为我的别名。这应该将C#编译器命令行更改为:
/reference:MyAlias=MyAssembly.dll
但实际上并没有这样做。 Visual Studio IDE似乎只是忽略引用上的别名属性设置。因此,当我在C#代码文件的顶部添加行extern alias MyAlias;
时,我得到错误,即在编译器的/ reference选项中未指定别名。我无法弄清楚我做错了什么。有什么想法吗?
答案 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)
我会做同样的事情:
我仍然会收到错误。在搞砸了一下后,我发现修复它的方法是将引用的dll设置为你正在使用的解决方案之外的dll。一旦我这样做,我们看到的错误消息就消失了,我能够继续我的项目。
我希望有帮助,快乐的编码!
答案 2 :(得分:10)
更新: 这是一个错误。它将在.Net 4.5中修复。
答案 3 :(得分:3)
使用以下步骤在VS2008中为我工作:
extern alias MyAlias
。 必须在任何using
语句之前。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();
顺便说一句,这一个对Reference
和PackageReference
都适用!
在这里找到解决方案: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)
答案 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>