【问题标题】:How to `extern alias` an assembly with .Net core?如何使用.Net核心“外部别名”程序集?
【发布时间】:2016-06-24 07:17:39
【问题描述】:

TLDR:一切都在标题中。

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

如何使用其中一种类型?

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

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

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

[编辑] 好像有一个未解决的问题here

【问题讨论】:

标签: c# .net asp.net-core .net-core


【解决方案1】:

我相信您试图链接到的问题在这里:
https://github.com/NuGet/Home/issues/4989

您可以使用 MSBuild 目标来解决问题。将此 sn-p 放入 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

【讨论】:

  • 是的,这就是问题所在。我编辑了我的问题。我没有测试你的解决方案,但它看起来可行,我会接受:)
  • 是“Directory.Build.targets”吗?
  • 是“Directory.Build.targets”,在哪个文件中?
  • Directory.Build.targets 是您在解决方案目录中创建的 MSBuild 文件。如果存在,它将被加载到您的构建中。如果您只在一个项目中需要它,您可以将其添加到您的csproj,但如果您有多个项目,将其添加到此文件中将允许在您的解决方案中的任何项目中使用它。
  • @davethieben 我收到以下错误并且无法解决。能否请您帮忙 错误 CS0430:外部别名“已签名”未在 /reference 选项中指定
【解决方案2】:

我在 .Net Core 2.2 中遇到问题,其中 MySqlConnector 类型名称和命名空间发生冲突,答案是创建别名。我认为这也应该满足您的需求,只需相应地更改下面的MySqlConnectorhttps://stackoverflow.com/a/48686823/479701

<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

【讨论】:

    【解决方案3】:

    目前不支持此功能。随时在 dotnet cli repo https://github.com/dotnet/cli/issues 中提出问题

    【讨论】:

      【解决方案4】:

      不再需要所有这些变通方法。您现在可以在 v16.7+ 的 dotnet 中使用 aliasDetails here.

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

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

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

      extern alias ExampleAlias;
      
      using ExampleAlias::Namespace;
      

      一切正常。 Docs for that here

      【讨论】:

        【解决方案5】:

        你可以这样做:

        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

        【讨论】:

        • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
        • 这里缺少有关如何在 csproj 中设置别名的信息
        猜你喜欢
        • 1970-01-01
        • 2018-11-26
        • 2010-09-12
        • 1970-01-01
        • 2018-07-09
        • 2020-05-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多