TLDR: 标题已经概括了一切。
假设你的 project.json
使用了两个包,这两个包有两个同名的类型(相同的名称,相同的命名空间)。
如何使用其中一个类型?
对于传统的 .Net,很容易。只需要使用extern alias即可。
但是如何在 .net core 中实现呢?
我没有看到在 package.json
中定义别名的选项,就像在程序集引用属性窗口中所做的那样。
我找到的唯一提到这个问题的地方是这里
[编辑] 看起来有一个未解决的问题在这里
TLDR: 标题已经概括了一切。
假设你的 project.json
使用了两个包,这两个包有两个同名的类型(相同的名称,相同的命名空间)。
如何使用其中一个类型?
对于传统的 .Net,很容易。只需要使用extern alias即可。
但是如何在 .net core 中实现呢?
我没有看到在 package.json
中定义别名的选项,就像在程序集引用属性窗口中所做的那样。
我找到的唯一提到这个问题的地方是这里
[编辑] 看起来有一个未解决的问题在这里
我相信您试图链接的问题在这里:
https://github.com/NuGet/Home/issues/4989
您可以通过使用 MSBuild Target 来解决此问题。将此代码段放入 Directory.Build.targets
中即可:
<Target Name="AddPackageAliases" BeforeTargets="ResolveReferences" Outputs="%(PackageReference.Identity)">
<PropertyGroup>
<AliasPackageReference>@(PackageReference->'%(Identity)')</AliasPackageReference>
<AliasName>@(PackageReference->'%(Alias)')</AliasName>
</PropertyGroup>
<ItemGroup>
<ReferencePath Condition="'%(FileName)'=='$(AliasPackageReference)'">
<Aliases>$(AliasName)</Aliases>
</ReferencePath>
</ItemGroup>
</Target>
然后在您的csproj中使用它,在您的PackageReference节点中像这样:
<ItemGroup>
<PackageReference Include="StackExchange.Redis.StrongName" Version="1.2.6" Alias="signed" />
</ItemGroup>
我在GitHub的问题中添加了以下评论:
https://github.com/NuGet/Home/issues/4989#issuecomment-426666530
在 .Net Core 2.2 中,我遇到了一个问题,MySqlConnector
类型名称和命名空间发生了冲突,解决方法是创建一个别名。我认为这对您的需求也适用,只需相应地更改下面的 MySqlConnector
即可:https://dev59.com/wqjka4cB1Zd3GeqPFuM4#48686823
<Target Name="ChangeAliasesOfStrongNameAssemblies" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
<ItemGroup>
<ReferencePath Condition="'%(FileName)' == 'MySqlConnector'">
<Aliases>MySqlConnectorAlias</Aliases>
</ReferencePath>
</ItemGroup>
</Target>
在使用前,请先在您的cs文件中添加以下代码:
extern alias MySqlConnectorAlias;
MySqlConnectorAlias::MySql.Data.MySqlClient.MySqlConnection
不再需要使用这些变通方法。现在你可以在dotnet v16.7+中使用alias
。 详细信息请参见此处。
因此,这里不再需要任何变通方法。只需将别名添加到项目文件中(智能感知似乎认为这不存在,但它确实有效):
<ProjectReference Include="Example.csproj" Aliases="ExampleAlias" />
然后按照 .Net Framework 的方式使用 extern alias ExampleAlias;
代码:
extern alias ExampleAlias;
using ExampleAlias::Namespace;
一切都正常工作。相关文档
extern alias Lib1;
extern alias Lib2;
using System;
using SpaceOne=Lib1::Space;
using SpaceTwo=Lib2::Space;
这里有一个示例:https://github.com/ernado-x/owl/blob/master/src/Owl/Program.cs
Directory.Build.targets
是一个 MSBuild 文件,你需要在你的解决方案目录中创建它。如果存在该文件,它将被加载到你的构建中。如果你只需要在一个项目中使用它,你可以将它添加到你的csproj
中,但如果你有多个项目,将它添加到这个文件中将允许它从你的解决方案中的任何项目中使用。 - Dave ThiebenDirectory.Build.targets
并在我的.csproj
中设置了别名 (signed
) 后,我试图在一个 C# 文件中执行extern alias signed
,但编译器无法识别。我漏掉了什么吗?谢谢。 - Jérôme MEVEL<Message Text="%(PackageReference.Alias)" Importance="high" />
,然后在某个时间点它开始工作了。除此之外,我真的不知道我做了什么来解决这个问题。感谢您的帮助! - Jérôme MEVEL