我正在使用C#和.NET 3.5.是否可以序列化一段代码,将其传输到某处,对其进行反序列化,然后执行它?
一个示例用法是:
Action
有些远程程序在做:
var action = Transmitter.Recieve(); action("hello world");
我的最终目标是能够在不同的进程中执行任意代码(它没有代码的先验知识).
是!!!
我们这样做是为了一个非常真实的表现.由于性能原因,在运行时或使用DSL执行此操作不是一种选择.
我们将代码编译成程序集,并将IL从方法中删除.然后,我们获取与此方法相关的所有元数据,并通过XML序列化整个混乱,压缩它,并将其放入我们的数据库中.
在重新水化时,我们使用DynamicMethod类重新构建IL和元数据,然后执行它.
我们这样做是因为速度快.我们有成千上万的小代码块.不幸的是,编译一段代码并在运行中运行它需要至少250毫秒,这对我们来说太慢了.我们采用了这种方法,它的工作非常好.在运行时,重新构建方法并运行它需要不可测量的时间.
唯一值得关注的是......签名的程序集和无符号程序集不能混合序列化的方法数据.
您可以尝试在项目中使用IronPython.这是微不足道的,做你问在Python什么.Python代码可以调用您的C#方法.至于安全性,您可以在某种受限制的环境中执行代码(例如RestrictedPython).