委托强制对方法进行类型安全调用.这通常通过编译器执行的静态类型检查来工作.但这不是唯一的方法,可以Delegate.DynamicInvoke()
用来绕过编译器类型检查.一个例子:
using System;
class Program {
delegate void foo(long arg);
static void Main(string[] args) {
var obj = new Example();
var dlg = Delegate.CreateDelegate(typeof(foo), obj, "Target");
dlg.DynamicInvoke(42);
}
}
class Example {
private long field;
public void Target(long arg) {
field = arg;
}
}
Run Code Online (Sandbox Code Playgroud)
现在开始修改这段代码,你可以做些什么来试图欺骗类型系统:
DynamicInvoke
调用中传递一个不同类型的参数DynamicInvoke
调用中传递一组不同的参数所有这些尝试都会毫无怨言地编译.它们都不会执行,您将获得运行时异常.这就是使委托安全的原因,你不能使用它们来调用一个会使堆栈失衡的方法,或者诱使目标方法访问未初始化的堆栈位置或不是激活帧的一部分.恶意软件劫持代码的传统方式.在C或C++中不存在这样的运行时检查,它们的编译器仅执行静态检查,并且可以通过简单的转换来绕过.
我的问题是,delagate的意思是什么"安全"?
使用委托调用的函数被赋予调用者的安全上下文,这会阻止委托执行低权限调用者不可用的任务.代理可以使用指向任何地方实现的函数的指针进行初始化.唯一的限制是签名.调用者在调用包含未知源的函数指针的委托时需要小心,因为可能存在意外的实现.使用代码访问安全性来保护代理.
图片来源:http: //etutorials.org/Programming/programming+microsoft+visual+c+sharp+2005/Part+III+More+C+Language/Chapter+8+Delegates+and+Events/