1

アセンブリ内のクラスをロックダウンして、同じアセンブリ内の他のクラスから呼び出されないようにしたいと考えています。つまり、アセンブリ内での横方向の呼び出しはありません。

クラス呼び出しにいくつかの検証を記述して、それらが同じアセンブリ内から呼び出されないようにするつもりでした。リフレクションを使用してこれを判断するにはどうすればよいですか?

したがって、次のシナリオです。

Assembly1
----------
Class 1A

Assembly2
----------
Class 2A
Class 2B

したがって、クラス 2A はクラス 2B を呼び出すことはできません。ただし、クラス 1A はクラス 2A またはクラス 2B を呼び出すことができます。

4

3 に答える 3

2

あなたが求めていることは、既存のアクセス修飾子では不可能です。

クラスを他のアセンブリに対してパブリックにすることはできませんが、内部的にプライベートにすることはできません。

Class2Bを別のアセンブリに分割して作成すると、 を に設定するinternalこともできます。InternalsVisibleToAttributeAssembly1

これが達成することは、Class2Aアクセスできないが、できるというClass1Aことです。


リフレクションを使用して実行時チェックを行うこともできます-Christian.Kの詳細による回答と同様です。

于 2012-05-02T13:18:53.733 に答える
1

そもそもなぜそれらを同じアセンブリに入れるのですか?

2B と 2A を独自のアセンブリに入れ、クラスを としてマークしますinternalInternalsVisibleTo「Assembly1」が「Assembly2B」と「Assembly2A」の内部にそれぞれアクセスできるようにするアセンブリ レベルの属性を提供します。

リフレクションを使用すると、これを回避できます。

セキュリティ上の目的でそのようなメカニズム (またはその他の手作りの「呼び出し元チェック」など) を使用することは、とにかくお勧めできません。「アーキテクチャ」の目的でそれを行いたい場合は、上記で提案されたものを使用して、NDependやカスタム FxCop/CodeAnalysis ルールなどのツールを使用できます。ビルド時にルールが破られていないことを検証できます。

于 2012-05-02T13:21:55.293 に答える
0

どうですか:

if (Assembly.GetCallingAssembly() == Assembly.GetExecutingAssembly())
{
    // Throw some exception
}

かなり変な行為に思えますが…

于 2012-05-02T13:21:32.577 に答える