📑

[.NET] NuGetパッケージでglobal usingの別名を公開する

2023/08/13に公開

背景

global using が登場しました。プロジェクト中のどこか1か所に書いておけば、それぞれのコードでいちいちusing System.Collections.Generic;などと書かなくても使えるようになります。

しかしglobal usingの効力は定義したプロジェクト内に限られます。プロジェクト参照やNuGetパッケージとして公開する場面にて、このglobal usingを他へも波及させる方法を書き残します

方法

既にまとめて頂いている記事がありますのでご参照ください。
https://zenn.dev/nuits_jp/articles/2023-05-15-global-usings

以下のような.propsファイルを作成してパッケージに含めるようにします。この.propsファイルにglobal usingの定義を書きます。

MyGreatLib.props
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Using Include="MyCompany.MyGreatLib" />
  </ItemGroup>
</Project>

alias構文の場合

以下が本記事で追加の内容です。

さてusingは別名を定義する構文も併せ持ち、これをglobalにすることもできます。

global using GdipBitmap = System.Drawing.Bitmap;

これを公開したい場合は、以下のように Alias="Foo" の要領で別名を書きます[1]

MyGreatLib.props
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Using Include="System.Drawing.Bitmap" Alias="GdipBitmap" />
  </ItemGroup>
</Project>

ジェネリック型のalias構文の場合

型引数が含まれる場合はどうでしょうか。

global using StringLazy = System.Lazy<string>;
global using MyDictionaryOfList = System.Collections.Generic.Dictionary<string, System.Collections.Generic.List<int>>;

これは<>をエスケープしつつC#流にそのまま書けばOKです。

MyGreatLib.props
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Using Include="System.Lazy&lt;string&gt;" Alias="StringLazy" />
    <Using Include="System.Collections.Generic.Dictionary&lt;string, System.Collections.Generic.List&lt;int&gt;&gt;" Alias="MyDictionaryOfList" />
  </ItemGroup>
</Project>

これは一次情報源がわからず、私の試行錯誤で見つけたものなのでご注意を、とお断りしておきます。

実験した環境

  • .NET 7
  • Visual Studio 17.7.0
脚注
  1. どこかで情報を得たと思いますが、記事執筆時には忘れてしまいました。思い出し次第追記します。 ↩︎

Discussion