業務アプリで利用しているSDKを更新していてはまったので覚書。
問題
今回 Microsoft.Azure.Cosmos
と Microsoft.Azure.Cosmos.Table
をそれぞれ用いる構成なのですが、単純にNuGetパッケージをインストールすると、名前空間が衝突する箇所があり、
エラー CS0433 型 'IndexingMode' が 'Microsoft.Azure.Cosmos.Client, Version=3.18.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' と 'Microsoft.Azure.Cosmos.Table, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' の両方に存在します
このようにエラーとなります。
解決策
.NETではこのように名前空間が衝突してしまう場合に、 externエイリアスという機能を利用して解決することができます。
C# 2.0 以降の新機能を一つづつ確認していきます。 以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。 extern エイリアス https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/extern-alias 同じ完全修飾型名を持つ、2 つアセンブリを参照する場合に名前空間のエイリアスを設定できる。 次の例では同じ名前の ClassLibrary.Cla…
DLLファイルだったら各DLLのプロパティでエイリアスを指定するらしいのですが、NuGetパッケージの場合はそういうことはできません。
この場合、csprojファイルに下記のように記載することで対応できます。
<Target Name="ChangeAliasesOfAzureTables" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
<ItemGroup>
<ReferencePath Condition="'%(FileName)' == 'Microsoft.Azure.Cosmos.Table(エイリアス指定したいNuGetパッケージ名)'">
<Aliases>AzureTable(エイリアス名)</Aliases>
</ReferencePath>
</ItemGroup>
</Target>
あとは通常通り、
extern alias AzureTable;
using AzureTable::Microsoft.Azure.Cosmos.Table;
こんな感じでusingを記載してやれば、うまく回避することができます。