.NET 2.0中引入了1级透明度模型(但是仅在程序集内被强制),透明代码是不可以访问关键代码的,即使是在同一个程序集内(或是在同一个类型里),如下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security;
using System.Security.Permissions;
//使用透明度模型级别1
[assembly: SecurityRules(SecurityRuleSet.Level1)]
[assembly: SecurityCritical]
namespace Mgen
{
class Program
{
//透明
static void Main(string[] args)
{
doo();
}
//关键
[SecurityCritical, SecurityTreatAsSafe]
static void doo()
{ }
}
}
此代码会抛出异常:
Unhandled Exception: System.MethodAccessException: Attempt by security transpare
nt method 'Mgen.Program.Main(System.String[])' to access security critical metho
d 'Mgen.Program.doo()' failed.
显然透明代码是不能直接访问关键代码的。
在透明度模型级别1,可以使用SecurityTreatAsSafe特性标记在方法上,就可以正常访问了:
[SecurityCritical, SecurityTreatAsSafe]
static void doo()
{ }
不过在.NET 4.0后引入了透明度模型级别2,安全模型发生了许多变化,SecurityTreatAsSafe也被废弃,取而代之的是SecuritySafeCritical特性,直接标记目标为“可靠安全代码”。
在.NET 4.0上述代码完整应该是:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security;
using System.Security.Permissions;
//.NET 4.0默认使用透明度模型级别2
[assembly: AllowPartiallyTrustedCallers]
namespace Mgen
{
class Program
{
//透明
static void Main(string[] args)
{
doo();
}
//可靠关键
[SecuritySafeCritical]
static void doo()
{ }
}
}