如何禁止调用方法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只是走栈确定的权限,不过,你可以通过只检查StackTrace
做到这一点,因为达林前面指出的。
其他提示
可以解决这个使用普通的面向对象设计。移动AllowedMethod
一类新的,使该ForbiddenMethod
类的私有方法:
public class MyClass
{
public void AllowedMethod() { // ... }
private void TargetMethod() { // ... }
}
AllowedMethod访问私有成员,但没有其他人具有。
我相信你应该尝试结构meaningfull类代码,并使用标准的访问修饰符(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 /库/ system.security.codeaccesspermission.aspx
通过使用属性就可以解决这个问题。
使用条件Attributs。
在顶
#define "Show"
public void TargetMethod()
{
//Code
}
[ Conditional("Hidden")]
public void HiddenMethod()
{
TargetMethod()
}
[ Conditional("Show")]
public void AllowMethod()
{
TargetMethod()
}
你的一个methos将被调用。