Я создал реализацию CodeAccessSecurityAttribute, которая использует информацию стека для поиска имени целевого класса, но в некоторых классах PrincipalPermition не создается, вместо этого система использует предварительный просмотр. Что я пропустил?
[ComVisible(true)]
[AttributeUsageAttribute(AttributeTargets.Constructor | AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
public sealed class MyPrincipalPermissionAttribute : CodeAccessSecurityAttribute
{
public MyPrincipalPermissionAttribute(SecurityAction action) : base(action) { }
public override IPermission CreatePermission()
{
if (Unrestricted)
return new PrincipalPermission(PermissionState.Unrestricted);
var stackTrace = new StackTrace();
var fullnameArray = new List<String>();
foreach (var frame in stackTrace.GetFrames())
{
try
{
var method = frame.GetMethod();
if (method != null && method.ReflectedType.IsSubclassOf(typeof (BaseClass)))
fullnameArray.Add(method.ReflectedType.FullName);
} catch {}
}
if (fullnameArray.Count() > 0)
return new PrincipalPermission(null, fullnameArray[0], true);
return new PrincipalPermission(PermissionState.Unrestricted);
}
}
И использование
public class MyClassCalledFirstWork: BaseClass
{
[MyPrincipalPermission(SecurityAction.Demand)]
public override void DoSomething()
{
return;
}
}
public class MyClassCalledSecondDontWork: BaseClass
{
[MyPrincipalPermission(SecurityAction.Demand)]
public override void DoSomething()
{
return;
}
}