Pandora Pocket

IT系と日常系の備忘録。三日坊主。

業務アプリで利用しているSDKを更新していてはまったので覚書。

問題

今回 Microsoft.Azure.CosmosMicrosoft.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エイリアスという機能を利用して解決することができます。

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を記載してやれば、うまく回避することができます。

参考

I use extern alias in my project so I need to change the reference alias from global to something else. The problem is that if I use Nuget to add the reference, every time I update the package the ...
[はてなブックマークで表示]