如何禁止调用方法C#

时间:2010-01-15 12:18:29

标签: c# .net permissions .net-security

我想允许仅从特定方法调用方法。看看下面的代码。

  private static void TargetMethod()
  {
  }

  private static void ForbiddenMethod()
  {
     TargetMethod();
  }

  private static void AllowedMethod()
  {
     TargetMethod();
  }

我只需要AllowedMethod可以调用TargetMethod。如何使用System.Security.Permissions中的类进行操作?

更新:感谢您的回答,但我不想辩论我的应用程序的设计。我只是想知道是否可以使用.net安全性来实现?

7 个答案:

答案 0 :(得分:24)

您可以使用常规的面向对象设计解决此问题。将AllowedMethod移至新类,并使ForbiddenMethod成为该类的私有方法:

public class MyClass
{
    public void AllowedMethod() { // ... }

    private void TargetMethod() { // ... }
}

AllowedMethod可以访问私有成员,但没有其他人拥有。

答案 1 :(得分:8)

我相信您应该尝试在有意义的类中构建代码,并使用标准访问修饰符(privateprotectedpublicinternal)。有什么特别的理由说明为什么这不能解决你的问题?

我能想到的唯一替代方法是从被调用者中遍历调用堆栈,但这可能会导致代码混乱和性能欠佳。

答案 2 :(得分:6)

您可以检查调用堆栈来完成此操作,但速度相当慢。如果可以避免,我不会推荐它。

如果你仍然想要这样做,你需要小心避免方法内联,否则你的代码可能会突然停止在Release版本下工作。

[MethodImpl(MethodImplOptions.NoInlining)]
private static void TargetMethod()
{
    StackFrame fr = new StackFrame(1, false);
    Console.WriteLine(fr.GetMethod().Name);
}

据我所知,没有开箱即用的属性可以做到这一点。

答案 3 :(得分:4)

我不确定这是否可以通过System.Security.Permissions实现,但在TargetMethod内,您可以获得调用者并采取相应行动:

StackTrace stackTrace = new StackTrace();
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name);

答案 4 :(得分:4)

如果代码以完全信任的方式运行,则CAS无法执行此操作。

如果代码在Full Trust中执行(即普通的本地应用程序,而不是Silverlight应用程序或从网络运行的东西),则完全绕过所有.NET CAS检查;任何安全属性都会被忽略。

但是,CAS只是走过堆栈来确定权限,你也可以这样做,正如Darin先前通过检查StackTrace所指出的那样。

答案 5 :(得分:3)

您可以使用CodeAccessPermission对象。您必须在自己的对象中实现该接口,以使其像您建议的那样工作。

http://msdn.microsoft.com/en-us/library/system.security.codeaccesspermission.aspx

答案 6 :(得分:2)

通过使用属性,您可以解决此问题。

使用条件属性。

在顶部

#define "Show" 


  public void TargetMethod()
    {
      //Code
    }
   [ Conditional("Hidden")]
   public void HiddenMethod()
    {
       TargetMethod()
    }
 [ Conditional("Show")]
  public void AllowMethod()
    {
       TargetMethod()
    }

你的一个方法就会被召唤。