CS801~2000

C# コンパイラ エラー CS1703について解説:重複アセンブリ参照の原因と対処法

CS1703は、C#のコンパイラが同じ簡易名を持つ複数のアセンブリ参照を区別できなくなった場合に発生するエラーです。

たとえば、同一ファイルが異なる場所に存在する場合や、バージョン番号が異なる参照がある場合に起こりやすいです。

対処方法としては、重複する参照の一方を削除するか、アセンブリに署名を付けるなどして参照の重複を解消する必要があります。

CS1703エラーの基本

エラーの定義と発生状況

CS1703エラーは、同じ簡易名(例えば、name)のアセンブリが複数回参照される場合に発生します。

コンパイラはメタデータ内でアセンブリを一意に識別する必要があるため、同一の簡易名を持つアセンブリが混在すると、どちらを使用すべきか判断できずエラーとなります。

このエラーは、同じファイルが異なるパスに存在する場合や、バージョン番号を変更せずに複数の参照を設定した場合などに発生することが多いです。

例えば、プロジェクトにおいて同一アセンブリをサイドバイサイドで配置しているケースで見受けられます。

また、ビルド時の参照解決の過程で、同一ファイルパスの参照は自動的に排除されますが、複数の異なる場所やバージョンの同一アセンブリが指定されると、エラーが顕在化する可能性があります。

エラーメッセージの構成

エラーメッセージは、次のような内容を含みます。

・同じ簡易名のアセンブリがすでにインポートされている旨の説明

・不要な参照を削除するか、サイドバイサイド配置を有効にするための署名が必要であるという指示

例えば、エラーメッセージには

「同じ簡易名 name でアセンブリが既にインポートされています。

参照の1つを削除するか、サイドバイサイドを有効にするために署名してください。」

という内容が記載され、どの参照に問題があるのかを明確に示してくれます。

重複アセンブリ参照の原因

同一簡易名による参照の衝突

重複アセンブリ参照の主要な原因は、異なる場所から同じ簡易名のアセンブリを参照していることです。

  • プロジェクト内に、同一のクラスやライブラリが複数のパスから参照設定されている場合
  • アセンブリの名前が重複しているため、コンパイラがどのアセンブリを使用すれば良いか識別できなくなる場合

このような状況では、プロジェクトのビルド構成を見直し、どちらか一方の参照を削除するか、もしくは明示的に外部別名extern aliasを設定することで、衝突を回避する必要があります。

ファイルパスやバージョンの不整合

参照しているアセンブリが同一ファイル名でも、配置場所やバージョンが異なる場合、コンパイラはこれらを区別できずにCS1703エラーを発生させます。

  • 異なるディレクトリに同一ファイル名のアセンブリが存在する状況
  • ビルド時にバージョン番号が更新されず、複数のバージョンを同時に参照している状況

この場合、アセンブリの配置先やバージョン管理を整理し、明確に一つのバージョンのみを指定するように調整することが推奨されます。

エラー発生の実例解析

コンパイル時のエラーメッセージ例

CS1703エラーが発生する際、コンパイル時に以下のようなエラーメッセージが表示されます。

「同じ簡易名 name でアセンブリが既にインポートされています。

参照の1つを削除するか、サイドバイサイドを有効にするために署名してください。」

このメッセージにより、どのアセンブリが重複しているかが把握できます。

サンプルコードによるエラー発生状況

以下は、CS1703エラーを再現するためのサンプルコードです。

コード内では、extern aliasを使用して2種類のアセンブリを明示的に参照しています。

なお、このコードは、そのままではCS1703エラーが発生する構成となっていますので、実際の開発環境でエラーの再現を確認するための例です。

using System;
// 外部別名を使って、2つのアセンブリを区別します。
// 以下のextern alias指定により、同じ簡易名のアセンブリ間で衝突が発生します。
extern alias A1;
extern alias A2;
namespace SampleApp
{
    // 仮想の名前空間"MyAssembly"に定義されたクラスAを対象としています。
    class Program
    {
        static void Main(string[] args)
        {
            // A1アセンブリとA2アセンブリの両方に同一のクラスAが存在する前提です。
            var instanceFromA1 = new A1::MyAssembly.A();  // A1側のクラスAを利用
            var instanceFromA2 = new A2::MyAssembly.A();  // A2側のクラスAを利用
            // サンプル出力:実際にはビルド時にCS1703エラーが発生するため、実行はできません。
            Console.WriteLine("CS1703エラーの再現サンプルです。");
        }
    }
}
CS1703エラーの再現サンプルです。

メッセージ内容の詳細解析

エラーメッセージは、以下の情報を示しています。

  • 「同じ簡易名 name」という部分で、重複しているアセンブリの識別子が提示されます。
  • 「参照の1つを削除するか、サイドバイサイドを有効にするために署名してください」という指示から、重複する参照を整理するか、外部別名などの対策を検討する必要があることが理解できます。

このメッセージによって、開発者はまずどのアセンブリが衝突しているのかを特定し、その上で、不要な参照を削除するか、必要であれば強い名前を付与するなどの対策をとる判断材料となります。

対処方法と回避策

不要な参照の削除方法

重複するアセンブリ参照を解消するため、まず不要な参照を削除する手順が有効です。

  • プロジェクトファイル.csprojや開発環境の参照設定を確認し、不要なアセンブリへの参照を削除する。
  • 複数のプロジェクト間で同一アセンブリが参照されている場合は、共通のアセンブリバージョンを利用することで衝突を回避する。

参照設定を整理することで、CS1703エラーの原因となる重複を防ぐことができ、ビルド時のトラブルシューティングが容易になります。

アセンブリへの署名付与手法

アセンブリに強い名前(署名)を付与することで、サイドバイサイド配置が可能になります。

  • 強い名前を付与するには、鍵ファイル.snkを作成し、アセンブリのコンパイル時に /keyfile オプションを指定します。
  • 署名が有効になれば、同じ簡易名のアセンブリであってもバージョン情報や署名情報によって識別でき、重複参照の問題が解決される場合があります。

この手法は、特にライブラリの再配布や複数プロジェクトでの共用を行う場合に有効です。

ビルド設定の調整方法

ビルド設定を適切に調整することで、CS1703エラーの発生を未然に防ぐことが可能です。

  • 複数のアセンブリが参照されている場合、各参照のバージョン番号やパスを統一する。
  • ビルド構成(Debug/Release)ごとに参照設定を見直し、不要なアセンブリが含まれないように管理する。
  • 必要に応じて、プロジェクトの依存関係やNuGetパッケージのバージョンを整理し、重複参照が発生しない状態にする。

これらの調整により、プロジェクトのビルドがスムーズになり、エラー発生のリスクを低減することができます。

まとめ

この記事では、C# のコンパイラエラー CS1703 の定義や発生状況、エラーメッセージの構造、重複するアセンブリ参照の原因(同一簡易名の衝突やファイルパス・バージョンの不整合)について説明しました。

さらに、具体的なエラー発生の例とサンプルコードを通して実際の状況を確認するとともに、不要な参照の削除、アセンブリの署名付与、ビルド設定の調整による対処方法を紹介しています。

関連記事

Back to top button
目次へ