- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Mono.Cecil was answered here 中实现 try/catch 的良好概述,但他在一次完整的尝试/捕捉/最后停下来。那么如何使用 Mono.Cecil 实现 try/finally?
最佳答案
这里是如何注入(inject)finally。
首先,您需要修复您的退货声明。你只想要一个。
Instruction FixReturns()
{
if (Method.ReturnType == TypeSystem.Void)
{
var instructions = body.Instructions;
var lastRet = Instruction.Create(OpCodes.Ret);
instructions.Add(lastRet);
for (var index = 0; index < instructions.Count - 1; index++)
{
var instruction = instructions[index];
if (instruction.OpCode == OpCodes.Ret)
{
instructions[index] = Instruction.Create(OpCodes.Leave, lastRet);
}
}
return lastRet;
}
else
{
var instructions = body.Instructions;
var returnVariable = new VariableDefinition("methodTimerReturn", Method.ReturnType);
body.Variables.Add(returnVariable);
var lastLd = Instruction.Create(OpCodes.Ldloc, returnVariable);
instructions.Add(lastLd);
instructions.Add(Instruction.Create(OpCodes.Ret));
for (var index = 0; index < instructions.Count - 2; index++)
{
var instruction = instructions[index];
if (instruction.OpCode == OpCodes.Ret)
{
instructions[index] = Instruction.Create(OpCodes.Leave, lastLd);
instructions.Insert(index, Instruction.Create(OpCodes.Stloc, returnVariable));
index++;
}
}
return lastLd;
}
}
Instruction FirstInstructionSkipCtor()
{
if (Method.IsConstructor && !Method.IsStatic)
{
return body.Instructions.Skip(2).First();
}
return body.Instructions.First();
}
void InnerProcess()
{
body = Method.Body;
body.SimplifyMacros();
ilProcessor = body.GetILProcessor();
var returnInstruction = FixReturns();
var firstInstruction = FirstInstructionSkipCtor();
var beforeReturn = Instruction.Create(OpCodes.Nop);
ilProcessor.InsertBefore(returnInstruction, beforeReturn);
InjectIlForFinaly(returnInstruction);
var handler = new ExceptionHandler(ExceptionHandlerType.Finally)
{
TryStart = firstInstruction,
TryEnd = beforeReturn,
HandlerStart = beforeReturn,
HandlerEnd = returnInstruction,
};
body.ExceptionHandlers.Add(handler);
body.InitLocals = true;
body.OptimizeMacros();
}
关于.net - Mono.Cecil:注入(inject)try/finally?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12769699/
我正在使用 Mono.Cecil 生成一个程序集,该程序集包含一个派生类,该派生类覆盖导入的基类中的特定方法。覆盖方法是一种“隐式”覆盖。问题是我无法弄清楚如何将其指定为覆盖。 我正在使用以下代码来创
我正在使用Mono.Cecil DLL 文件并编写此代码: AssemblyDefinition sourceAssembly = AssemblyFactory.GetAssembly(assemb
我正在尝试从 .NET 类型获取 Mono.Cecil TypeDefinition,但没有成功。 我正在使用这样的代码: var type = typeof(MarkdownMonster.AppC
我正在使用 Cecil 来尝试读取我的属性属性: [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited =
我有以下方法: public void DoSomething() { Console.WriteLine(""); } 我想用 Mono Cecil 修改这段代码。我想在方法中创建自定义类的实例
我想通过 Mono.Cecil 添加一个新方法,它有一个输出参数,比如: private static bool XXXXX(out Int32 a) 我尝试了以下代码来添加此参数 TypeRefer
如何通过名称获取基类方法的 MethodReference? 我试过了 type.BaseType.Resolve().Methods; 如果我将包含基类的 dll 添加到 assemblyresol
我一直在寻找一个新手问题,但找不到一个简单的例子。谁能给我一个简单的例子,说明如何将 MethodBody 放入最可用的字符串结果中?喜欢: using Mono.Cecil; using Mono.
Cecil中有类似Reflection.Emit.DynamicMethod的东西吗?谢谢。 动态方法 编辑: 下面的事情呢? EmitCall(例如 IL.EmitCall(OpCodes.Call
出于某种原因,当我尝试加载一些程序集并对其进行分析时,出现错误 Mono.Cecil.AssemblyResolutionException: Failed to resolve assembly..
我正在使用 Mono.Cecil 编辑我的目标方法的 IL 代码,以便我可以记录该方法的入口点,而无需编辑实际代码。我能够将调用指令插入到可以执行日志记录操作的方法中。但我不知道如何记录我的目标方法的
我正在尝试重写一个属性的 get 方法: get { return dataString; } 到: get { string temp = dataString;
我正在使用 Mono.Cecil 在属性 setter 中注入(inject)一些指令,并且在注入(inject) Brfalse_s 指令时出现奇怪的错误。这是代码,它简短而简单。 private
我正在使用 Mono.Cecil 在自动实现的属性 setter 中注入(inject)一些 IL 代码。问题是,我可以从 TypeDefinition.Fields 对象中获取对它的引用,但是当我注
我遵循了提示 here ,我什至将以下几行放入: var MSILWorker = prop.SetMethod.Body.GetILProcessor(); MSILWorker.Body.Init
任务: 查找所有调用函数 public static void WriteString(int index0, string s, int index1) { Console.WriteLin
我怎样才能像这样转动字符串: "call System.Console.WriteLine" "ldstr \"hello\"" 带操作数的指令? 最佳答案 如果您现在如何使
好吧,这个问题可能看起来很奇怪,但它很简单——我的意思是如果我在反编译代码中有一个“goto”(brtrue 等),比如示例 br IL_0003 call ***** IL_0003: ret 然后
有没有办法在代码中获取str1? [MyAttribute("str1")] class X {} Mono.Cecil.CustomAttribute.Fields 的实例是空的。 最佳答案 在 .
我的项目中的静态构造函数一直存在一些问题。我需要向类型“”添加一个静态构造函数,以便调用我的资源解密方法。 在下面的 gif 中,您会看到我遇到的问题。 我还将包含代码片段。 创建cctor的代码:
我是一名优秀的程序员,十分优秀!