開発プロジェクトで共通的に利用するライブラリを作成している。
設定情報をXMLで記述したファイルをデシリアライズして、クラスに情報を格納しようとしたところ、格納先クラスの宣言を「Public」から「Friend」に変更したらとたんに以下のエラーが出た。
保護レベルの設定が原因で '****.Commons.Context.Config.OpeLogSettingForm' にアクセスできません。 パブリックの型のみ処理できます。プログラム '[3620] Commons_SampleSub.exe' はコード 0 (0x0) で終了しました。
会社名が関係しそうなところは伏せ字にしてある。
保護レベル、ということは、制限を緩めれば通ることもあるのか?まぁ、読み込み先を利用するのがライブラリ内の処理だけであり、一般開発者が触れる必要が無いことからFriendに指定したのだが...だめなのかな?
VBのFriend指定の説明を見ると
Friend 省略できます。Friend キーワードで宣言されたプロシージャは、フレンド アクセスを行います。 これらの値には、宣言コンテキスト、および同じプログラム内のその他の場所からアクセスできます。 Protected Friend 省略できます。Protected Friend キーワードで宣言されたプロシージャは、プロテクト アクセスおよび フレンド アクセスを行います。これらの値は、派生クラスのコードだけでなく、同じプログラム内の コードでも使用できます。プロテクト フレンド アクセスを指定できるのは、クラスのメンバに対して だけです。
うーん。
C#のドキュメントにあった説明がわかりやすかった。
public 自由にアクセスできる。 protected 包含しているクラスとサブクラスにアクセスが許可される。 internal 包含しているアセンブリのクラスにアクセスが許可される (アセンブリについては後述) 。 protected internal 包含しているアセンブリのクラスまたは包含しているクラスのサブクラスにアクセスが許可される。 private 包含しているクラスだけにアクセスが許可される。
おそらく、C#では「Internal」宣言に近いと思うのだが、「包含しているアセンブリのクラスに許可」とある。シリアライズは、別アセンブリになるシリアライザが行うため、直接Friend指定されたクラスへはアクセスできないのか...。
となると、デシリアライズの受け口になるクラスは、必ずPublicで宣言される必要があるのか...。