如何使用 .Net 核心“外部别名”程序集?

How to `extern alias` an assembly with .Net core?

TLDR:标题中的内容差不多。

假设您的 project.json 使用两个包,这两个包具有两种名称相同的类型(相同的名称,相同的命名空间)。

如何使用这些类型之一?

有了 .Net 分类,这很容易。只需使用 extern alias.

但是 你如何使用 .net core 做到这一点? 我在 package.json 中没有看到任何选项可以让我像在程序集引用中那样定义别名 属性 window.

我设法找到的唯一提到这个问题的是 here

[edit] 好像有一个open issue here

目前不支持此功能。欢迎在 dotnet cli repo https://github.com/dotnet/cli/issues

中提出问题

你可以这样做:

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

我相信您要 link 解决的问题在这里:
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>

然后在您的 PackageReference 节点中的 csproj 中使用它,如下所示:

<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

<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

不再需要所有这些解决方法。从 v16.7+ 开始,您现在可以在 dotnet 中使用 aliasDetails here.

因此,none 此处的解决方法不再需要。只需将别名添加到您的项目文件中(intelli-sense 似乎不认为它存在但它有效):

<ProjectReference Include="Example.csproj" Aliases="ExampleAlias" />

然后像使用 .Net 框架一样使用 extern alias ExampleAlias; 代码:

extern alias ExampleAlias;

using ExampleAlias::Namespace;

一切正常。 Docs for that here