Olivier
Olivier

Reputation: 5688

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

TLDR: Everything is pretty much in the title.

Suppose that your project.json uses two packages that have a two types which are named the same (same name, same namespace).

How to use one of thoses types ?

With classing .Net, that's easy. Just use an extern alias.

But how do you do that using .net core ? I dont see any option in package.json that would let me define an alias like I would do in an assembly reference property window.

The only mention of this issue i managed to find is here

[edit] It seems that there is an open issue here

Upvotes: 25

Views: 16731

Answers (5)

Liam
Liam

Reputation: 29714

There's no need for all these workarounds anymore. You can now use alias in dotnet from v16.7+. Details here.

So none of the workarounds here are required anymore. Simply add the alias into your project file (intelli-sense didn't seem to think this existed but it works):

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

then use the extern alias ExampleAlias; code as you would for .Net framework:

extern alias ExampleAlias;

using ExampleAlias::Namespace;

and everything works. Docs for that here

Upvotes: 9

Andy Raddatz
Andy Raddatz

Reputation: 2882

I had a problem in .Net Core 2.2 where the MySqlConnector type name and namespace had a collision and the answer was to create an alias. I think this should work for your needs too, just change MySqlConnector below accordingly: https://stackoverflow.com/a/48686823/479701

<Target Name="ChangeAliasesOfStrongNameAssemblies" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
    <ItemGroup>
      <ReferencePath Condition="'%(FileName)' == 'MySqlConnector'">
        <Aliases>MySqlConnectorAlias</Aliases>
      </ReferencePath>
    </ItemGroup>
  </Target>

then in your cs file before usings:

extern alias MySqlConnectorAlias;

then reference your type like this:

MySqlConnectorAlias::MySql.Data.MySqlClient.MySqlConnection

Upvotes: 7

Dave Thieben
Dave Thieben

Reputation: 5427

I believe the issue you are trying to link to is here:
https://github.com/NuGet/Home/issues/4989

You can workaround by using an MSBuild Target. drop this snippet into 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>

and then use it in your csproj in your PackageReference nodes like this:

<ItemGroup>
    <PackageReference Include="StackExchange.Redis.StrongName" Version="1.2.6" Alias="signed" />
</ItemGroup>

added this as a comment to the GitHub issue:
https://github.com/NuGet/Home/issues/4989#issuecomment-426666530

Upvotes: 14

Andrew Gubskiy
Andrew Gubskiy

Reputation: 17

You can do it in this way:

extern alias Lib1;
extern alias Lib2;
using System;
using SpaceOne=Lib1::Space;
using SpaceTwo=Lib2::Space;

Example you can find here: https://github.com/ernado-x/owl/blob/master/src/Owl/Program.cs

Upvotes: -2

Pavel Krymets
Pavel Krymets

Reputation: 6293

There is no support for this at the moment. Feel free to file an issue in dotnet cli repo https://github.com/dotnet/cli/issues

Upvotes: 0

Related Questions