C# メソッドの呼び出しを禁止する方法
-
20-09-2019 - |
質問
特定のメソッドからのみメソッドの呼び出しを許可したいと考えています。以下のコードを見てください。
private static void TargetMethod()
{
}
private static void ForbiddenMethod()
{
TargetMethod();
}
private static void AllowedMethod()
{
TargetMethod();
}
必要なのは、AllowedMethod が TargetMethod を呼び出すことができることだけです。のクラスを使用してそれを行う方法 System.Security.Permissions
?
更新しました: ご回答ありがとうございます。ただし、アプリケーションの設計について議論したくありません。.netセキュリティを使用してそれを行うことが可能かどうか知りたいだけです?
解決
コードが完全信頼で実行されている場合、CAS はこれを行うことができません。
コードが完全信頼で実行されている場合 (つまり、Silverlight アプリケーションやネットワークから実行されるものではなく、通常のローカル アプリケーション)、すべての .NET CAS チェックは完全にバイパスされます。セキュリティ属性は単に無視されます。
ただし、CAS は単にスタックを調べて権限を決定するだけであり、Darin が以前に指摘したように、単にチェックするだけでそれを行うこともできます。 StackTrace
.
他のヒント
これは、通常のオブジェクト指向設計を使用して解決できます。動く AllowedMethod
新しいクラスに移行して作成する ForbiddenMethod
そのクラスのプライベート メソッド:
public class MyClass
{
public void AllowedMethod() { // ... }
private void TargetMethod() { // ... }
}
allowedMethod はプライベート メンバーにアクセスできますが、他のメンバーはアクセスできません。
コードを意味のあるクラスで構造化し、標準のアクセス修飾子 (private
, protected
, public
, internal
)。これで問題が解決しない具体的な理由はありますか?
私が思いつく唯一の代替案は、呼び出し先内から呼び出しスタックを走査することですが、コードが混乱し、最適なパフォーマンスが得られない可能性があります。
これを達成するために呼び出しスタックを調べることもできますが、かなり遅くなります。避けられるのであればお勧めしません。
それでもこれを実行したい場合は、メソッドのインライン化も避けるように注意する必要があります。そうしないと、リリース ビルドでコードが突然動作しなくなる可能性があります。
[MethodImpl(MethodImplOptions.NoInlining)]
private static void TargetMethod()
{
StackFrame fr = new StackFrame(1, false);
Console.WriteLine(fr.GetMethod().Name);
}
私の知る限り、これを行うためのすぐに使える属性はありません。
これが実現可能かどうかはわかりません System.Security.Permissions
, 、しかし内部では TargetMethod
発信者を取得し、それに応じて行動することができます。
StackTrace stackTrace = new StackTrace();
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name);
CodeAccessPermission オブジェクトを使用できる場合があります。ただし、あなたが提案しているように動作させるには、独自のオブジェクトにインターフェイスを実装する必要があります。
http://msdn.microsoft.com/en-us/library/system.security.codeaccesspermission.aspx
属性を使用すると、この問題を解決できます。
条件付き属性を使用します。
一番上にある
#define "Show"
public void TargetMethod()
{
//Code
}
[ Conditional("Hidden")]
public void HiddenMethod()
{
TargetMethod()
}
[ Conditional("Show")]
public void AllowMethod()
{
TargetMethod()
}
メソッドの 1 つが呼び出されます。