如何使用 .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 中使用 alias
。 Details here.
因此,none 此处的解决方法不再需要。只需将别名添加到您的项目文件中(intelli-sense 似乎不认为它存在但它有效):
<ProjectReference Include="Example.csproj" Aliases="ExampleAlias" />
然后像使用 .Net 框架一样使用 extern alias ExampleAlias;
代码:
extern alias ExampleAlias;
using ExampleAlias::Namespace;
一切正常。 Docs for that here
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 中使用 alias
。 Details here.
因此,none 此处的解决方法不再需要。只需将别名添加到您的项目文件中(intelli-sense 似乎不认为它存在但它有效):
<ProjectReference Include="Example.csproj" Aliases="ExampleAlias" />
然后像使用 .Net 框架一样使用 extern alias ExampleAlias;
代码:
extern alias ExampleAlias;
using ExampleAlias::Namespace;
一切正常。 Docs for that here