Tag: mono.cecil

Mono Cecil错误生成PDB

下面的代码允许我更改方法体并保存组件。 // Recreate PDB var assemblyResolver = new DefaultAssemblyResolver(); var assemblyLocation = Path.GetDirectoryName(pathBin); assemblyResolver.AddSearchDirectory(assemblyLocation); /*if (!string.IsNullOrEmpty(HintPath)) { assemblyResolver.AddSearchDirectory(HintPath); }*/ var silverlightAssemblyPath = Environment.ExpandEnvironmentVariables(@”C:\Windows\Microsoft.NET\Framework64\v4.0.30319\”); assemblyResolver.AddSearchDirectory(silverlightAssemblyPath); var readerParameters = new ReaderParameters { AssemblyResolver = assemblyResolver }; var writerParameters = new WriterParameters(); var pdbName = Path.ChangeExtension(pathBin, “pdb”); if (createPDB && File.Exists(pdbName)) { var symbolReaderProvider = new PdbReaderProvider(); readerParameters.SymbolReaderProvider […]

如何使用Mono.Cecil保存更改的程序集?

我有一个没有AssemblyFactory类的Mono.Cecil版本。 可能它是Cecil类的0.9版本。 有出路吗?

成员在另一个模块中声明,需要导入

我使用Mono.Cecil创建一个新的自定义属性类型,然后将其添加到现有类型。 为了演示它,我有一个名为“Sample”的预先存在的DLL,其类型称为“SampleType”。 我想使用Mono.Cecil在名为“NewAttribute”的“Sample”中编写一个新类型,然后将此属性添加到“SampleType”。 代码看起来像这样:(不完全,但它足够好,例如) static void AddCustomeAttribute() { var module = ModuleDefinition.ReadModule(AssemblyName); var attrType = NewAttributeProvider.Add(module); var ctor = attrType.GetConstructors().First(); //module.Import(ctor); CustomAttribute attribute = new CustomAttribute(ctor); attribute.ConstructorArguments.Add(new CustomAttributeArgument(module.TypeSystem.String, “InternalClass”)); module.CustomAttributes.Add(attribute); module.Write(AssemblyName); //error } – public static TypeDefinition Add(ModuleDefinition targetModule) { var type = targetModule.AddType(“Namespace”, “NewAttribute”, TypeAttributes.Public | TypeAttributes.Class, targetModule.Import(typeof(Attribute))); var stringType = targetModule.TypeSystem.String; var nameField […]

使用Mono.Cecil注入GeneratedCodeAttribute

我正在使用Mono.Cecil来管理我的.net 2.0程序集。 在操作之后,我想通过注入模块属性将程序集标记为已处理 var stringType = _module.Import(typeof(string)); var baseCtor = _module.Import(typeof(GeneratedCodeAttribute).GetConstructor(new[] { typeof(string), typeof(string) })); var result = new CustomAttribute(baseCtor); result.ConstructorArguments.Add(new CustomAttributeArgument(stringType, “ProcessedBySomething”)); result.ConstructorArguments.Add(new CustomAttributeArgument(stringType, “1.0”)); 保存程序集后,它变得依赖于.net 4.0,因为操作app是用.net 4.0编写的。 GeneratedCodeAttribute存在于.net 2.0中,那么我做错了什么?

.NET CIL操纵评估堆栈

我有这个CIL代码序列,我通过使用Mono.Cecil注入。 但是,修改后的.NET C#应用程序将无法运行。 目标:从堆栈中手动加载和弹出值以在Console.WriteLine显示 for (int i = 0; i < 3; i++) { int z = some value popped manually from stack; Console.WriteLine(z); } 这是我修改的简单main()程序: .method private hidebysig static void Main(string[] args) cil managed { .entrypoint .maxstack 5 .locals init ( [0] int32 num, [1] int32 num2) L_0000: ldc.i4.6 //manually push value 6 to […]

如何使用Mono.Cecil注入System.Object.Equals?

使用Mono.Cecil我想重写以下属性: public string FirstName { get { return _FirstName; } set { _FirstName = value; } } 对此: public string FirstName { get { return _FirstName; } set { if (System.Object.Equals(_FirstName, value)) { return; } _FirstName = value; } } 这只是重写的内容,但它是我遇到问题的地方。 使用Reflector我可以看到以下代码根据需要重写属性,除了调用System.Object.Equals()。 如果期望IL代码是: call bool [mscorlib]System.Object::Equals(object, object) 但它被写成: call instance void RewriteSharp.Person::.ctor() 写入对System.Object.Equals的调用的代码是: setMethodWriter.InsertBefore( firstExistingInstruction, […]

Mono.Cecil类似于Type.GetInterfaceMap?

System.Reflection.Type包含GetInterfaceMap ,它有助于确定从接口实现某些方法的方法。 Mono.Cecil是否包含这样的内容? 或者如何实现这样的行为?

使用Mono.Cecil替换对类型/命名空间的引用

背景(不必要,令人困惑,只为好奇) 我正在使用Unity3D for Mobile的免费版本,它不允许我在移动设备上使用System.Net.Sockets命名空间。 问题是我正在使用引用System.Net.Sockets已编译的.dll库(即IKVM)。 我实际上并没有使用引用System.Net.Sockets IKVM中的类,因此我没有购买3000美元的Unity Pro移动许可证,而是创建了一个名为dudeprgm.Net.Sockets的Sockets命名空间的存根库, dudeprgm.Net.Sockets替换了所有存根的类和方法(我使用Mono源代码完成此操作)。 我的问题 我需要将dll中的所有System.Net.Sockets.*引用替换为dudeprgm.Net.Sockets.* 。 我知道这样的事情是可能的并且由其他人完成 (参见下面的编辑 ,在页面底部) 。 我想知道自己该怎么做。 我能够使用Mono.Cecil提出以下代码。 它遍历所有IL指令,检查操作数是否为InlineType ,然后检查内联类型是否是System.Net.Sockets一部分,然后将其重命名为dudeprgm.Net.Sockets并写入。 **我不确定这是否是在Mono.Cecil中进行“查找和替换”的正确方法。 问题是,这并没有捕获所有Sockets使用(见下文)。 private static AssemblyDefinition stubsAssembly; static void Main(string[] args) { AssemblyDefinition asm = AssemblyDefinition.ReadAssembly(args[0]); stubsAssembly = AssemblyDefinition.ReadAssembly(“Socket Stubs.dll”); // … // Call ProcessSockets on everything // … asm.Write(args[1]); } /* * This will be […]

使用mono.cecil添加自定义属性?

我无法想象如何使用Mono.Cecil将自定义属性添加到方法我想要添加的属性是这样的: .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = ( 01 00 00 00 ) 有谁知道如何添加自定义属性

cecil:Instruction.Operand类型对应于Instruction.OpCode.Code值

是否有任何文档或是否有一部分我可以参考的cecil源代码,以全面了解cecil将用于给定Code值的Operand类型? 例如:我可以从MethodBodyRocks收集Ldloc采用VariableDefinition类型的Operand ,但是我无法追踪其他一些指令代码。