如何在 .Net Core 中使用 `extern alias` 引用程序集?

24

TLDR: 标题已经概括了一切。

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

如何使用其中一个类型?

对于传统的 .Net,很容易。只需要使用extern alias即可。

但是如何在 .net core 中实现呢? 我没有看到在 package.json 中定义别名的选项,就像在程序集引用属性窗口中所做的那样。

我找到的唯一提到这个问题的地方是这里

[编辑] 看起来有一个未解决的问题在这里

5个回答

13

我相信您试图链接的问题在这里:
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


Directory.Build.targets 是一个 MSBuild 文件,你需要在你的解决方案目录中创建它。如果存在该文件,它将被加载到你的构建中。如果你只需要在一个项目中使用它,你可以将它添加到你的 csproj 中,但如果你有多个项目,将它添加到这个文件中将允许它从你的解决方案中的任何项目中使用。 - Dave Thieben
@davethieben,你能否请您完善一下您的回答?在创建了 Directory.Build.targets 并在我的 .csproj 中设置了别名 (signed) 后,我试图在一个 C# 文件中执行 extern alias signed,但编译器无法识别。我漏掉了什么吗?谢谢。 - Jérôme MEVEL
@davethieben 好的,我关闭并重新打开了 VS,然后我进行了一些测试 <Message Text="%(PackageReference.Alias)" Importance="high" />,然后在某个时间点它开始工作了。除此之外,我真的不知道我做了什么来解决这个问题。感谢您的帮助! - Jérôme MEVEL
然后当我切换到Git分支并在我想要的库上进行操作时,它就停止工作了。非常奇怪,暂时无法解释。我会另找时间解决这个问题,反正这个任务已经被推迟了... - Jérôme MEVEL
1
@davethieben 我遇到了以下错误,无法解决。你能帮忙看一下吗?错误信息为:CS0430:在/reference选项中未指定extern alias 'signed'。 - Suresh Raja
显示剩余4条评论

7

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

6

不再需要使用这些变通方法。现在你可以在dotnet v16.7+中使用alias详细信息请参见此处

因此,这里不再需要任何变通方法。只需将别名添加到项目文件中(智能感知似乎认为这不存在,但它确实有效):

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

然后按照 .Net Framework 的方式使用 extern alias ExampleAlias; 代码:

extern alias ExampleAlias;

using ExampleAlias::Namespace;

一切都正常工作。相关文档


0

-2

1
虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - Alex Riabov
2
这里缺少有关如何在csproj中设置别名的信息。 - Isen Ng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接