- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须将一个对象的实例传递给一个函数,所以显然所有要作为参数的信息都将加载到评估堆栈中这是我正在寻找的代码
someClass SomeObject = new someClass();
il.Emit(OpCodes.LoadObject, SomeObject);
il.Emit(OpCodes.CallVirt, MethodInfo Function);
public void Function(Object obj)
{
Type type = typeof(obj);
//do something w.r.t to the type
}
我不需要任何类型的信息存储在类中,我不能使用任何原始类型来做出决定
最后我读到我可以使用指针来加载使用一些操作码的类型......但我完全迷失在这里,任何帮助或指向正确方向的指针都会很棒:)
[更新]
好吧,我找到了我自己问题的答案,尝试了一下,效果很好不知道这是否是正确的方法,但我可以成功创建对象并将其加载到堆栈中并将其传递给函数
ConstructorInfo ci = typeof(SomeClass).GetConstructor(System.Type.EmptyTypes);
IL.Emit(OpCodes.Newobj, ci);
IL.Emit(OpCodes.Call, SomeFunctionMethodInfo);
SomeFunctionMethodInfo 是一个以 Object 作为参数的函数,我已经成功地将对象传递给函数并且可以操作它并将类作为对象返回。
我在任何地方都找不到对这个例子的引用,只是通过 MSDN 弄明白了,我做错了什么或者有什么缺点吗?请专家指正或提供更好的答案
最佳答案
你不能在 IL
中凭空获取引用,除非你将引用编码为 IntPtr
文字,在这种情况下:
A。不要这样做
b.你需要 pin , 和
C。不要这样做。
最佳方法取决于您正在编写的方法的签名。如果它是静态的并且不带任何参数……好吧,这有点棘手。就我个人而言,我倾向于将一个对象传递给生成的方法,并让委托(delegate)从那里获取它需要的任何外部数据。但另一种方法是生成一个类,并将方法编写为访问类型字段的实例方法。
区别(因此我更喜欢)是第一个方法(最多)需要一个 object[]
参数——你可以使用 DynamicMethod
;第二个需要 MethodBuilder
、TypeBuilder
、ModuleBuilder
、AssemblyBuilder
等,因此工作量更大。
我提到 object[]
的原因是通常您希望生成的方法有一个共同的签名,即使它们需要不同的输入。这使您可以绑定(bind)到固定的委托(delegate)类型并使用更快的 Invoke
执行(DynamicInvoke
很慢)。
例如:
class SomeType { }
delegate void SomeDelegateType(params object[] args);
public class Program
{
public static void Main()
{
var dn = new DynamicMethod("foo", (Type)null, new[] {typeof(object[])});
var il = dn.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldc_I4_0);
il.Emit(OpCodes.Ldelem_Ref);
il.EmitCall(OpCodes.Call, typeof(Program).GetMethod("Function"), null);
il.Emit(OpCodes.Ret);
var action = (SomeDelegateType)dn.CreateDelegate(typeof(SomeDelegateType));
var obj = new SomeType();
action(obj);
}
public static void Function(object obj)
{
Type type = obj.GetType();
Console.WriteLine(type);
}
}
如果你不能有一个输入参数,那么你将不得不在你创建的类型上使用字段——这实际上正是编译器在你编写时所做的(例如)
object someObj = ...
Action action = () => Function(someObj);
创建为:
class <>somehorriblename {
public object someObj;
public void SomeGeneratedName() { Function(someObj); }
}
...
var captureClass = new <>somehorriblename();
captureClass.someObj = ...
Action action = captureClass.SomeGeneratedName;
关于c# - 将一个对象放在 ILGenerator 中的堆栈顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4989681/
给出以下代码: using System; using System.Reflection.Emit; using System.Diagnostics; using System.Reflectio
我正在尝试构造一个泛型类型的实例并在该实例上调用一个方法。然后返回方法的结果。 var genericType = typeof(GenericType<>).MakeGenericType(type
我想得到这个: .property instance class [WorldTool.Core]WorldTool.IInputPort SomePort { .get instance c
我正在尝试使用 DynamicMethod 并尝试使用 IL 来创建一些对象。我想创建以下非常基本的对象: new Queue(new List{100}); 我已经使用 ILDASM 查看生成此代码
我正在使用 System.Reflection.Emit 为类型生成包装器。在某一时刻,原始对象可能会在访问时抛出错误 (FaultException),并且该错误应该被我的 try { } catc
Food obj = ...; ILGenerator gen = (...).GetILGenerator(); gen.Emit( ?? obj ?? ); // replace this gen
我使用 ILGenerator 生成一些 IL,这是我的代码: DynamicMethod method = new DynamicMethod("test", null, Type.EmptyTyp
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我必须将一个对象的实例传递给一个函数,所以显然所有要作为参数的信息都将加载到评估堆栈中这是我正在寻找的代码 someClass SomeObject = new someClass(); il.Emi
使用 Ildasm 我得到了这个: .method public hidebysig virtual instance string Mymethod() cil manage
我已经编写了一些函数来使用 ILGenerator 创建一个 exe 文件。我想要的是向用户展示在不使用外部工具(如 ILDasm 或 Reflector)的情况下生成的 IL 语言。 在我的程序执行
考虑为我自己的语言制作编译器,我尝试使用 Reflection.Emit 框架生成一些 MSIL 代码。当我声明局部变量时使用 int 时它工作正常。但是,当我想声明一个尚未编译的类型的局部变量时,我
我正在使用 ILGenerator.Emit 生成动态类型。我正在生成一个方法主体,它将方法参数的类型存储在一个数组中。为了实际将元素存储在数组中,我循环遍历给定方法的参数并构建必要的 IL 来存储元
如何使用 ILGenerator 设置 .maxstack 指令? 例如,典型的 setter 方法的 .maxstack 为 2: .maxstack 2 // The evalua
我如何使用 ILGenerator.Emit(不是 LambdaExpression.Compile?因为我正在尝试寻找性能更高的解决方案)动态创建具有未知 MethodInfo 的委托(delega
我有一些代码使用 IlGenerator.Emit 使用数据读取器创建和填充通用对象。它工作得很好,但是我需要扩展它以在数据库字段名称包含下划线时填充简单的子对象。 例如,名为“Address_Lin
基本上,我试图将字节数组中的数据反序列化为对象。我正在尝试使用 UTF8 编码的 GetString 方法来读取字符串。这是我的部分代码: var mm = new DynamicMethod("ge
我正在使用 System.Reflection.Emit,有时我想从 MethodBuilder 创建一个委托(delegate): MethodBuilder fooBuilder = create
我正在尝试通过在运行时发出 IL 来编译 DynamicMethod。我希望它执行以下操作: array.OrderByDesc( /* Select Field/Property Expressio
我添加到 ILGenerator 字符串 ilGen.Emit(OpCodes.Ldarg_0); ilGen.Emit(OpCodes.Ldfld, readField); 和 ilGen.Emit
我是一名优秀的程序员,十分优秀!