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

C# 将现有方法附加到动态程序集,而不是为其生成IL,c#,.net,reflection,.net-assembly,reflection.emit,C#,.net,Reflection,.net Assembly,Reflection.emit,我不熟悉Reflection.EmitAPI,并且已经生成了一个简单的最小程序集,其中包含一个入口点,该入口点基于一些简单的I/O检查返回一个出口代码。创建外部程序集的原因是,一段代码需要在当前进程空间之外运行,并且本身是瞬态的。它最终将被创建应用程序删除 话虽如此,要生成的代码相当复杂,我宁愿避免为临时程序集创建单独的项目。我对ILGenerator的了解不够,无法将ILGenerator用于这种复杂的方法 我还读过关于使用现有方法生成IL的文章,除了解析IL之外,似乎不可能。我不知道如何获取

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

话虽如此,要生成的代码相当复杂,我宁愿避免为临时程序集创建单独的项目。我对ILGenerator的了解不够,无法将ILGenerator用于这种复杂的方法

我还读过关于使用现有方法生成IL的文章,除了解析IL之外,似乎不可能。我不知道如何获取现有方法,将其从当前上下文中分离并添加到新的动态类型中。如果存在这样一种方式,这将是对这篇文章的一个可接受的回答


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

最终使用表达式树解决了这一问题,而不必发出原始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.
var queue=new queue();
var参数=Expression.Parameter(typeof(string[]),“args”);
Enqueue(Expression.Call(typeof(Console.GetMethod)(“WriteLine”,新类型[]{}));
var block=Expression.block(队列);
var lambda=Expression.lambda(块,新参数Expression[]{arguments});
lambda.CompileToMethod(builderMethod);
//builderMethod是先前创建的MethodBuilder实例。

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

动态代码生成的另一个选项是CodeDom API,它允许您动态编译C。您可以直接从源文本或使用对象模型进行编译。是的,这绝对是一个选项。您看过
methodrent
@莱皮:不,我没有。我正在尝试这个示例,同时也在尝试找出如何从现有方法中提取字节。谢谢你的链接!看起来和我要找的最接近。你应该把这作为一个答案来贴出来。下面的选民愿意留下评论吗?