- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发一些 .Net 应用程序,我需要用我自己的代码注入(inject)任何新的程序集方法。我正在使用 Mono.Cecil 获取装配体,我找到了一些样本,但它们已经足够老了。不幸的是,github wiki 上的 migraton 部分没有任何信息。
所以,我有这段代码:
using System;
using Mono.Cecil;
using Mono.Cecil.Cil;
namespace CustomFieldsInjection
{
public partial class Injector
{
public static void MethodInjection(string assemblyFilename, string typeName, string methodName)
{
AssemblyDefinition assembly = AssemblyFactory.GetAssembly(assemblyFilename);
TypeReference returnTypeReference = assembly.MainModule.Import(typeof(void));
MethodDefinition methodDefinition = new MethodDefinition(methodName, MethodAttributes.Public | MethodAttributes.Static, returnTypeReference);
Instruction instruction1 = methodDefinition.Body.CilWorker.Create(OpCodes.Nop);
Instruction instruction2 = methodDefinition.Body.CilWorker.Create(OpCodes.Ldstr, methodName);
MethodReference writeline = assembly.MainModule.Import(typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
methodDefinition.Body.CilWorker.Append(instruction1);
methodDefinition.Body.CilWorker.Append(instruction2);
methodDefinition.Body.CilWorker.InsertAfter(instruction2, methodDefinition.Body.CilWorker.Create (OpCodes.Call, writeline));
methodDefinition.Body.CilWorker.Append (methodDefinition.Body.CilWorker.Create(OpCodes.Ret))
assembly.MainModule.Inject(methodDefinition, assembly.MainModule.Types[typeName]);
MethodReference methodReference = null;
foreach (MethodDefinition method in assembly.MainModule.Types[typeName].Methods)
{
if (method.Name == methodName)
{
methodReference = assembly.MainModule.Import(method);
break;
}
}
Instruction callTest = methodDefinition.Body.CilWorker.Create(OpCodes.Call, methodReference);
if (assembly.EntryPoint != null)
{
assembly.EntryPoint.Body.CilWorker.InsertBefore(assembly.EntryPoint.Body.Instructions[0], callTest);
}
AssemblyFactory.SaveAssembly(assembly, assemblyFilename);
}
}
}
这是旧样本。大多数功能都是最新的。我对这个结构很感兴趣:
assembly.MainModule.Inject(methodDefinition, assembly.MainModule.Types[typeName]);
我找不到这种设计的新类似物。有人可以告诉我它可以被替换吗?
最佳答案
我不熟悉你所指的构造,但是向现有类型添加 MethodDefinition
非常容易
using (var assemblyDefinition = AssemblyDefinition.ReadAssembly("assemblyPath")) {
var module = AssemblyDefinition.MainModule;
//Select the type you need to open for addition
var typeDef = module.Types.First(td => td.Name == "footer");
//Add your MethodDefinition
typeDef.Methods.Add(your_method_definition);
//Write the assembly back
assemblyDefinition.Write();
}
注意:如果您还没有使用 cecil 0.10.0.0,您将使用略有不同的 ReadAssembly()
和 Write()
变体(没有 使用
,并将assemblyPath传递给Write
,主要...)
关于c# - 使用 Mono.Cecil 在 C# 程序集中注入(inject)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42565442/
我正在使用 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的代码:
我是一名优秀的程序员,十分优秀!