如何禁止调用方法C#

如何禁止调用方法C#,c#,.net,permissions,.net-security,C#,.net,Permissions,.net Security,我希望只允许从特定方法调用该方法。请看下面的代码 private static void TargetMethod() { } private static void ForbiddenMethod() { TargetMethod(); } private static void AllowedMethod() { TargetMethod(); } 我只需要AllowedMethod就可以调用TargetMethod。如何使用Sy

我希望只允许从特定方法调用该方法。请看下面的代码

  private static void TargetMethod()
  {
  }

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

  private static void AllowedMethod()
  {
     TargetMethod();
  }
我只需要AllowedMethod就可以调用TargetMethod。如何使用
System.Security.Permissions
中的类执行此操作


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

我认为您应该尝试将代码组织成有意义的类,并使用标准的访问修饰符(
private
protected
public
internal
)。这不能解决你的问题,有什么具体原因吗


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

我不确定使用
System.Security.Permissions
是否可以实现这一点,但在
TargetMethod
中,您可以获得调用方并相应地采取行动:

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

您可以使用普通的面向对象设计来解决这个问题。将
AllowedMethod
移动到新类,并将
ForbiddenMethod
设为该类的私有方法:

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

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

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

您可以检查调用堆栈来完成此操作,但速度相当慢。如果可以避免的话,我不建议这样做

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

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

据我所知,没有现成的属性可以执行此操作。

使用属性可以解决此问题

使用条件属性

在顶端

#define "Show" 


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

将调用您的方法之一。

您可能可以使用CodeAccessPermission对象。您必须在自己的对象中实现该接口,才能使其按照您的建议工作


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

如果代码以完全信任的方式执行(即正常的本地应用程序,而不是silverlight应用程序或从网络运行的程序),则所有.NET CAS检查都会被完全绕过;任何安全属性都会被忽略


CAS只是通过遍历堆栈来确定权限,而您也可以这样做,正如Darin在前面指出的那样,只要检查
StackTrace

,如果它是私有的,为什么它很重要?这个问题怎么在6分钟内就被投票支持了9次?您是在试图保护自己吗?除此之外,我无法想象这有什么用。@alga:这样做非常慢,所以如果我是你,我会重新考虑这个特殊的习惯。至少对于经常被调用的方法来说,“我不想讨论应用程序的设计”——你来错地方了;似乎可以通过实现
CodeAccessPermission
来封装这一点是的,我知道。但是我对如何使用安全属性很感兴趣。这种技术很慢,而且可能很脆弱:抖动的方法内联可能会导致
GetMethod
调用返回意外的结果。(当然,你可以告诉JITter不要内联,就像Thorarin的回答一样。)这样就可以完全删除
HiddenMethod
。我认为alga想要的是,选择一些允许调用
TargetMethod
的方法,同时拒绝所有其他方法(包括第三方代码中的方法)调用
TargetMethod
。条件编译无助于实现这一点^^