将现有方法附加到动态程序集,而不是为其生成IL

时间:2014-07-24 05:43:06

标签: c# .net reflection .net-assembly reflection.emit

我是Reflection.Emit API的新手,并且生成了一个带有入口点的最小程序集,该入口点基于一些简单的I / O检查返回退出代码。创建外部程序集的原因是一段代码需要在当前进程空间之外运行,并且本身就是瞬态的。它最终将被创建应用程序删除。

话虽如此,要生成的代码非常复杂,我宁愿避免为瞬态程序集创建单独的项目。我不太了解IL足以将ILGenerator用于这种复杂的方法。

我还阅读了this SO question关于使用现有方法生成IL的问题,并且似乎不可能解析IL。我不知道采用现有方法的方法,将其从当前上下文中分离出来并将其添加到新的动态类型中。如果存在这种方式,那么这个帖子就是可以接受的答案。

我的最后一点是让生成的程序集将生成程序集引用为库。即使两个程序集都是WinForms应用程序,将它们作为库引用是否有缺点?

1 个答案:

答案 0 :(得分:0)

最后使用表达式树解决它,而不必发射原始IL。

var queue = new Queue<Expression>();
var arguments = Expression.Parameter(typeof(string []), "args");

queue.Enqueue(Expression.Call(typeof(Console).GetMethod("WriteLine", new Type [] { })));

var block = Expression.Block(queue);
var lambda = Expression.Lambda<Func<string [], int>>(block, new ParameterExpression [] { arguments });

lambda.CompileToMethod(builderMethod);
// builderMethod is a MethodBuilder instance created earlier.

这非常强大,非常适合使用ILGenerator不需要micro-perf的情况。