shuhelohelo’s blog

Xamarin.Forms多めです.

参照したライブラリとGAC内のライブラリが重複した場合の対処

「ライブラリAはB.dllとC.dllの両方に存在します」

f:id:shuhelohelo:20190513160016j:plain

というエラーが発生し、かつ参照しているライブラリは一つしかないのに、という場合、それはどうやらGAC(Global Assembly Cache)と重複しているようです。

この重複を解消する必要があり、その方法は2つあります。

  • GAC内のライブラリの削除
  • プロジェクトで参照しているライブラリの除外(または削除)

GAC内のライブラリの削除

docs.microsoft.com

削除にはgacutilコマンドを使用するのですが、さて、これはどこにあるのでしょうか。

コマンドプロンプトで入力しても、そんなコマンドありません、と言われてしまいます。

これはVisual Studioのインストール時に一緒にインストールされるDeveloper Command Prompt for VSで実行できるコマンドです。

f:id:shuhelohelo:20190513155614p:plain

これを起動して、以下のコマンドを実行します。

今回は「MySql.Data.dll」が重複しているということなので、GAC内の「MySql.Data.dll」を削除します。

まずは、そのライブラリがあるかどうかを確認してみましょう。 確認にはgacutil -l ライブラリ名を実行します。

C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise>gacutil -l mysql.data
Microsoft (R) .NET Global Assembly Cache Utility.  Version 4.0.30319.0
Copyright (c) Microsoft Corporation.  All rights reserved.

グローバル アセンブリ キャッシュには次のアセンブリが含まれています:
  mysql.data, Version=8.0.14.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL

項目の数 = 1

見つかりました。では削除してみましょう。 削除にはgacutil -u ライブラリ名を実行します。

C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise>gacutil -u mysql.data
Microsoft (R) .NET Global Assembly Cache Utility.  Version 4.0.30319.0
Copyright (c) Microsoft Corporation.  All rights reserved.


アセンブリ: mysql.data, Version=8.0.14.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL

インストール失敗: mysql.data, Version=8.0.14.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL
選択されたオプションを使うには、管理者のアクセス許可が必要です。管理者のコマンド プロンプトを使ってこれらのタスクを完了 してください。
アンインストールされたアセンブリの数 = 0
エラーの数 = 1

あらためて管理者権限で実行します。

f:id:shuhelohelo:20190706131313p:plain

C:\Windows\System32>gacutil -u mysql.data
Microsoft (R) .NET Global Assembly Cache Utility.  Version 4.0.30319.0
Copyright (c) Microsoft Corporation.  All rights reserved.


アセンブリ: mysql.data, Version=8.0.14.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL
アンインストールできません: アセンブリは 1 つまたはそれ以上のアプリケーションで必要とされています
保留中の参照:
              スキーム: <WINDOWS_INSTALLER>  ID: <MSI>  説明 : <Windows Installer>
アンインストールされたアセンブリの数 = 0
エラーの数 = 0

うーん。どうやらMySql.DataWindows Installerから参照されているため削除できないようです。

GAC内のライブラリの削除という方法では、今回の件の解決にはなりませんでした。

プロジェクトで参照しているライブラリの除外(削除)

Visual Studioでは参照しているライブラリを削除することができますが、一時的に除外することもできます。

削除

ソリューションエクスプローラーで参照しているライブラリを右クリックして、コンテキストメニューから削除を選択すれば削除されます。 f:id:shuhelohelo:20190706132833p:plain

除外

削除ではなく一時的にプロジェクトから除外してビルド時に使用しないようにすることもできます。

先ほどと同じようにソリューションエクスプローラーで参照しているライブラリを右クリックして、コンテキストメニューからプロジェクトから除外を選択します。

f:id:shuhelohelo:20190706133154p:plain

これだと、必要な時にまたコンテキストメニューからプロジェクトに復帰させることができます。