- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在玩反射,我的短代码有问题:
public class Test
{
public Test()
{
}
public string Call()
{
string called = "Called";
return called;
}
}
和用法:
var method = new DynamicMethod("dummy", null, Type.EmptyTypes);
var g = method.GetILGenerator();
g.DeclareLocal(typeof(Object));
g.Emit(OpCodes.Newobj, typeof(Test).GetConstructor(Type.EmptyTypes));
g.Emit(OpCodes.Stloc, 0);
g.Emit(OpCodes.Nop);
g.Emit(OpCodes.Ldloc, 0);
g.Emit(OpCodes.Call, typeof(Test).GetMethod("Call", new Type[]{}));
g.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[]{ typeof(string) }));
g.Emit(OpCodes.Nop);
//g.Emit(OpCodes.Pop); - used in debugging
g.Emit(OpCodes.Ret);
var action = (Action)method.CreateDelegate(typeof(Action));
action();
Console.Read();
所以。我正在尝试在运行时创建新方法。在那个方法中,我正在创建新的空测试实例。然后,我试图将它设置为 object 类型的位置 (0)。然后我加载它并调用它的方法 Call 来获取字符串。最后,我试图将字符串结果显示在屏幕上。我的代码适用于“Ldloc_0”。当调用“Call”方法时会发生错误。有人知道如何解决这个问题吗?请帮忙。
最佳答案
Call(...)
并且是一个实例方法;尝试使用 CallVirt
而不是 OpCodes.Call
。 Console.WriteLine
是一个静态 方法,因此应该使用Call
。
如有疑问,只需为要发出的内容编写 C#,然后在反射器中查看即可。
请注意,Ldloc/0
后跟一个 call/callvirt 将无法验证 - 也应该在其中进行转换:
g.DeclareLocal(typeof(Object));
g.Emit(OpCodes.Newobj, typeof(Test).GetConstructor(Type.EmptyTypes));
g.Emit(OpCodes.Stloc, 0);
g.Emit(OpCodes.Ldloc, 0);
g.Emit(OpCodes.Castclass, typeof(Test));
g.Emit(OpCodes.Callvirt, typeof(Test).GetMethod("Call", new Type[] { }));
g.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine",
new Type[] { typeof(string) }));
g.Emit(OpCodes.Ret);
或更好:
g.DeclareLocal(typeof(Test));
g.Emit(OpCodes.Newobj, typeof(Test).GetConstructor(Type.EmptyTypes));
g.Emit(OpCodes.Stloc_0);
g.Emit(OpCodes.Ldloc_0);
g.Emit(OpCodes.Callvirt, typeof(Test).GetMethod("Call", new Type[] { }));
g.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine",
new Type[] { typeof(string) }));
g.Emit(OpCodes.Ret);
或最好的:
g.Emit(OpCodes.Newobj, typeof(Test).GetConstructor(Type.EmptyTypes));
g.Emit(OpCodes.Callvirt, typeof(Test).GetMethod("Call", new Type[] { }));
g.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine",
new Type[] { typeof(string) }));
g.Emit(OpCodes.Ret);
关于c# - Reflection.Emit error Operation can destabilize runtime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11137379/
我正在尝试纠正一个 Func,我可以用它来访问属性的 get 方法,但遇到了绊脚石。 下面的动态方法创建得很好,但是当它被调用时我得到以下错误。 VerificationException,操作可能会
在我的 App i 中调试时有这个异常:{"Operation could destabilize the runtime."} 在 foreach 循环中: foreach (var item in
我需要在运行时使用 TypeBuilder 创建一个类型。这种类型应该实现一个特定的接口(interface),以便可以在编译时统一处理这种动态类型的实例。 该接口(interface)应返回一个对象
运行 RDLC 时,我在报告框架内显示以下消息: Failed to load host assembly. Operation could destabilize the runtime. 有谁知道
是否可以在 UnityContainer 中配置的另一种类型的构造函数中实例化在 UnityContainer 中配置的类型?使用我当前的解决方案,我得到了一个 ResolutionFailedExc
System.Security.VerificationException: Operation could destabilize the runtime. at Connance.Communic
我创建了一个非常简单的函数来执行以下操作: public static object[] ToArray(int ID) { return new object[4];
我目前正在玩反射,我的短代码有问题: public class Test { public Test() { } public string Call() {
我目前正在玩反射,我的短代码有问题: public class Test { public Test() { } public string Call() {
在我的程序中,我手工制作了我的 LINQ 表达式(我正在将我自己的表达式树转换为 LINQ - 我们目前使用 EF,但这可能会改变,所以我通过使用我自己的表达式来验证应用程序的这一部分并编写一些将其转
Server Error in '/' Application. 什么是解决这个问题的好方法?我让调试单步执行 global.asax 中的所有内容,并且那里没有错误。 Operation could
我们最近升级了一个 web/mvc 应用程序以使用 StrucutreMap 3.0.4 现在,当尝试在“Line Level Timings, All Methods with Source”或更高
我最近尝试将一个由 SubSonic 2.2 生成 DAL 的 .net 2.0 项目升级到 Visual Studio 2010 下的 .NET 4.0。 项目转换没有错误,但现在我在尝试启动它时收
这段代码: namespace ConsoleApplication3 { class Program { static void Main(string[] args
考虑以下代码: protected override IEnumerable GetListInternal( IQueryModel2 queryModel) { /// Cause
我是一名优秀的程序员,十分优秀!