CS801~2000

C#コンパイラエラー CS1726について解説:InternalsVisibleTo属性の署名エラー対処法

CS1726エラーは、C#でInternalsVisibleTo属性を使用する際に発生します。

署名付きアセンブリの場合、公開キーを適切に指定しないとフレンドアセンブリへのアクセスが拒否されるため、エラーが生じます。

対処方法としては、対象アセンブリに正しい公開キーを追加するか、署名を必要としない設定に変更するなどの手段が考えられます。

CS1726エラーの発生要因

このエラーは、厳密な名前(強い署名)のアセンブリが、InternalsVisibleTo属性により別のアセンブリをフレンドとして指定する際に、公開キーが必要になるため発生します。

指定されたアセンブリが公開キー情報を含まない場合、フレンド アセンブリとして認識されず、エラー CS1726が出力されます。

InternalsVisibleTo属性の役割と制約

InternalsVisibleTo属性は、同一アセンブリ内のinternalメンバーへのアクセスを、指定した別のアセンブリに許可するために利用されます。

これにより、主にユニットテスト時など、限られた範囲で内部実装にアクセスできるようになります。

ただし、フレンド アセンブリが厳密な名前を持つ場合、正確なアセンブリ名に加えて公開キーが必須となります。

厳密な名前のアセンブリの要件

厳密な名前のアセンブリは、公開キーによって一意に識別されるため、InternalsVisibleTo属性で指定する際にもその公開キー情報を含める必要があります。

例えば、署名付きアセンブリが「FriendAssembly」という名前のアセンブリにアクセスを許可する場合、属性は次のように記述されなければなりません。

using System.Runtime.CompilerServices;
// attributes.csファイルなどに記述(コンパイル対象に含める)
[assembly: InternalsVisibleTo("FriendAssembly, PublicKey=0024000004800000940000000602000000240000525341310004000001000100ABCDEF1234567890")]

この形式に従わず、単に"FriendAssembly"と記述した場合、厳密な名前の検証によりエラーCS1726が発生します。

公開キーの設定の必要性

公開キーは、強い署名を持つアセンブリの整合性を担保するために利用されます。

InternalsVisibleTo属性に公開キーを含めることで、フレンド アセンブリとして許可される対象が正確かつ安全に定義される仕組みです。

公開キーが正しく設定されないと、意図しないアセンブリが内部メンバーにアクセスするリスクを低減するため、コンパイラはエラーで通知します。

フレンドアセンブリ利用時の注意点

フレンドアセンブリを利用する場合、以下の点に注意する必要があります。

  • フレンドとして指定するアセンブリが強い署名の場合、InternalsVisibleTo属性に正確な公開キー情報を含める必要があります。
  • フレンド アセンブリの名前や公開キーが一致しないと、内部メンバーへのアクセスが許可されず、想定外の動作となる可能性があります。
  • プロジェクトのコンパイル設定やキーの管理方法が正しく設定されているか、定期的に確認することが推奨されます。

エラー解消の方法

CS1726エラーを解消する方法は大きく分けて2通りあります。

ひとつは、署名付きアセンブリとして正しく公開キーを設定する方法、もうひとつは、署名なしのアセンブリに変更する方法です。

署名付きアセンブリへの変更

署名付きアセンブリを利用する場合、正しい公開キー情報を含んだInternalsVisibleTo属性を記述する必要があります。

公開キー作成の手順

公開キーは、Microsoftのsn.exeツールを利用して作成することが可能です。

一般的な手順は以下の通りです。

  1. コマンドプロンプトを開き、次のコマンドを実行して公開キーファイルを生成します。

sn -k MyKey.snk

  1. 生成されたMyKey.snkファイルをプロジェクトに追加し、プロジェクトのプロパティで署名設定を有効にして、キーとして指定します。

以下は、公開キーを含むInternalsVisibleTo属性を設定し、Main関数が含まれたサンプルコードです。

using System;
using System.Runtime.CompilerServices;
// 公開キーを含むInternalsVisibleTo属性の設定例
[assembly: InternalsVisibleTo("FriendAssembly, PublicKey=0024000004800000940000000602000000240000525341310004000001000100ABCDEF1234567890")]
namespace SignedAssemblyDemo
{
    class Program
    {
        // 内部メンバーにアクセスを許可するクラス(フレンドアセンブリ内で利用可能)
        internal class InternalClass
        {
            public static string GetMessage()
            {
                return "署名付きアセンブリの内部メンバーにアクセス";
            }
        }
        static void Main(string[] args)
        {
            // フレンドアセンブリが内部メンバーにアクセスできることを確認するための出力
            Console.WriteLine(InternalClass.GetMessage());
        }
    }
}
署名付きアセンブリの内部メンバーにアクセス

InternalsVisibleTo属性の修正方法

署名付きアセンブリでエラーが発生している場合、InternalsVisibleTo属性の記述を誤っている可能性があります。

属性に正確なアセンブリ名と公開キーが含まれているか確認してください。

たとえば、次のように書く必要があります。

[assembly: InternalsVisibleTo("FriendAssembly, PublicKey=0024000004800000940000000602000000240000525341310004000001000100ABCDEF1234567890")]

以下は、正しい属性を適用したサンプルコードです。

using System;
using System.Runtime.CompilerServices;
// 正しい形式のInternalsVisibleTo属性
[assembly: InternalsVisibleTo("FriendAssembly, PublicKey=0024000004800000940000000602000000240000525341310004000001000100ABCDEF1234567890")]
namespace CorrectAttributeDemo
{
    internal class InternalUtility
    {
        public static string FetchInfo()
        {
            return "属性が正しく設定されたフレンドアセンブリの内部メソッドからの情報";
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(InternalUtility.FetchInfo());
        }
    }
}
属性が正しく設定されたフレンドアセンブリの内部メソッドからの情報

署名なし対応の選択肢

場合によっては、アセンブリを署名しない環境に変更することも解決方法の一つです。

もし署名が不要な場合、フレンドアセンブリとして指定する際に公開キー情報は不要になります。

アセンブリの署名設定を無効にすることで、以下のようにシンプルな属性指定となります。

using System;
using System.Runtime.CompilerServices;
// 署名なしアセンブリの場合のInternalsVisibleTo属性
[assembly: InternalsVisibleTo("FriendAssembly")]
namespace UnsignedAssemblyDemo
{
    internal class InternalService
    {
        public static string GetStatus()
        {
            return "署名なしアセンブリの内部状態にアクセス";
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(InternalService.GetStatus());
        }
    }
}
署名なしアセンブリの内部状態にアクセス

エラー発生時の確認事項

CS1726エラーが発生した場合、以下の点を確認することで問題の解消につながります。

コンパイル設定のチェック

プロジェクトのコンパイル設定を十分に確認してください。

特に、以下の項目をチェックすることが重要です。

  • プロジェクトに公開キーファイルが正しく参照されているか
  • コンパイラオプションでキーが指定されているか
  • 署名設定が有効になっているかどうか

Visual StudioなどのIDEの場合、プロジェクトのプロパティ内の「署名」タブで設定内容を確認することができます。

コマンドラインからコンパイルする場合は、/keyfileオプションを利用しているかどうかを確認してください。

属性設定の再確認方法

InternalsVisibleTo属性の記述は非常に正確でなければなりません。

以下の点を再確認してください。

  • アセンブリ名に誤字がないか
  • 公開キー情報が省略されていないか、または誤った情報が記述されていないか
  • 複数のInternalsVisibleTo属性が競合していないか

必要に応じて、属性設定を一度削除し、正しい情報を記述し直すことで、エラーの原因を特定できます。

また、簡単なサンプルプロジェクトを作成して、同じエラーが発生するかどうか検証するのも有効な手段です。

まとめ

本記事を通して、InternalsVisibleTo属性の役割や厳密な名前のアセンブリに必要な公開キー設定について理解できます。

CS1726エラーの発生原因と、署名付き/署名なし各対応方法、そしてコンパイル設定および属性記述の確認手順が具体例を交えて解説されており、エラー解消の手順が明確になります。

関連記事

Back to top button