Tag: mono.cecil

使用Mono.Cecil导入方法

请用方法导入帮我​​。 我想编织程序集和从另一个程序集中定义的基类注入方法调用引用(实际上它是定义编织代码的程序集)。 private void InsertCallSetReference() { //Get the load instruction to replace var ilProcessor = Property.SetMethod.Body.GetILProcessor(); var argumentLoadInstructions = ilProcessor.Body.Instructions.ToList(); MethodReference methodReference = ImportMethod(“SetReference”); foreach (var instruction in argumentLoadInstructions) { if (instruction.OpCode == OpCodes.Stfld) { ilProcessor.InsertAfter(instruction, ilProcessor.Create(OpCodes.Call, methodReference)); ilProcessor.InsertAfter(instruction, ilProcessor.Create(OpCodes.Ldarg_1)); ilProcessor.InsertAfter(instruction, ilProcessor.Create(OpCodes.Ldstr, DBFieldName)); ilProcessor.InsertAfter(instruction, ilProcessor.Create(OpCodes.Ldarg_0)); ilProcessor.Remove(instruction); break; } } } 方法导入代码工作正常并返回方法引用 private MethodReference ImportMethod(string name) […]

Mono.Cecil,Missing编译器需要成员’System.Runtime.CompilerServices.ExtensionAttribute..ctor’

我下载了最新的Mono.Cecil,现在每当我启动我的项目时,它都会给我错误。 如果我删除并添加mono.cecil,它就会消失。 但每次打开我的项目时都会感到痛苦。

Roslyn /查找引用 – 无法正确加载Workspace

我正在尝试编写一些代码来查找任何给定方法的所有方法调用,因为我正在寻找创建一个开源UML序列图表工具。 但是,我遇到了麻烦,越过前几行代码:/ API看起来已经发生了巨大的变化,我似乎无法通过查看代码来推断出正确的用法。 当我做: var workspace = new CustomWorkspace(); string solutionPath = @”C:\Workspace\RoslynTest\RoslynTest.sln”; var solution = workspace.CurrentSolution; 我发现workspace.CurrentSolution有0个项目。 我认为这将与之前的Workspace.LoadSolution( string solutionFile )相当,后者可能会包含解决方案中的任何项目,但我没有找到任何成功的路径。 我非常困惑0.o 如果有人可以提供一些关于我如何使用FindReferences API来识别特定方法的所有调用的额外指导,那将非常感谢! 或者,我会更好地采取静态分析方法吗? 我想支持lambdas,iterator方法和async之类的东西。 ================================================== ================== 编辑 – 以下是基于已接受答案的完整示例: using System.Linq; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.MSBuild; using Microsoft.CodeAnalysis.FindSymbols; using System.Diagnostics; namespace RoslynTest { class Program { static void Main(string[] args) { […]

Mono.Cecil可以修改已经加载在AppDomain中的代码吗?

我想在运行时向某个类添加一些行为。 我知道如何在运行时使用Reflection.Emit进行子类化,但这还不够,根据一些外部配置,我需要在类型T上的方法中注入操作码,以便从中inheritance的所有类自动获得此行为。(我无法使用.NET分析API) 可以用Mono.Cecil完成这样的事吗? 如果不能修改加载的程序集上的代码,那很好如果我可以在加载程序集之前进行修改然后将修改后的程序集加载到内存中,但我不知道如何控制程序集加载。

如何以编程方式替换.NET程序集中的嵌入资源?

我正在尝试使用C#代码替换exe(.NET,C#)文件的资源。 我找到了这篇文章并制作了这段代码(使用Mono.Cecil 0.6): AssemblyDefinition asdDefinition = AssemblyFactory.GetAssembly(“C:\\File.exe”); EmbeddedResource erTemp = new EmbeddedResource(“encFile”, ManifestResourceAttributes.Public); erTemp.Data = myNewFileBytes; asdDefinition.MainModule.Resources.RemoveAt(0); asdDefinition.MainModule.Resources.Add(erTemp); AssemblyFactory.SaveAssembly(asdDefinition, “C:\\newFile.exe”); 代码实际上是删除资源,然后添加一个具有相同名称的新资源。 资源名称为encFile并存储为encFile.exe (同时尝试)。 我测试了代码,删除工作(我可以通过文件的大小来判断)和添加,但是新文件崩溃就像我用仅删除创建的文件(用于测试) – 它就像他一样看不到被替换的资源。 我该怎么做才能解决这个问题? 可能在编辑的EXE文件中有一些变化? EXE文件以这种方式读取其资源: byte[] buffer = ProjectName.Properties.Resources.encFile;

Mono.Cecil是否负责分支机构等位置?

那么这个问题可能看起来很奇怪,但很简单 – 我的观点是,如果我在反编译代码中有一个“goto”(brtrue等),例如 br IL_0003 call ***** IL_0003: ret 然后我在****调用之后添加一个命令,将顶点处的br恢复为应该或该代码。 塞西尔是单独做的还是我必须照顾所有这些分支? :/它不是很难修复它们但是如果Cecil没有那么我根本就不会启动这个项目,我没有时间(或知识)获得高级IL魔法:P (是的我知道它不会是IL_0003只是例如)

如何确定方法中调用哪些方法?

我想列出从特定方法调用的所有方法。 例如,如果我有以下代码: public void test1() { test2(); test3(); } 该列表应包含test2()和test3()。 如果可以列出相同类的方法以及另一个类的方法,那将是很好的。 另外,我想找到一种方法来检测方法使用哪些字段: public class A { private String test1 = “”; private String test2 = “”; public void test() { Console.WriteLine(test1); } } 因此应该列出test1。 我尝试使用Mono.Cecil,但遗憾的是我找不到很多关于该项目的文档。 那么有人知道怎么做吗? 编辑:我想用Mono.Cecil来做,因为通过它的API,我可以直接在我的应用程序中使用结果。 如果我在Visual Studio或类似工具中使用内置工具,则很难对结果进行处理。

CCI vs. Mono.Cecil – 优点和缺点

我已经看过讨论这两个类似框架的文章,但大多数都是两年左右。 我认为这两个项目现在比两年前更加成熟,情况更复杂。 因此,考虑到每个图书馆的现状,我希望有人可以提供每个图书馆的优缺点的详细解释,目前应该首选。

C#拦截/更改/重定向方法

假设我在第三方dll中有一个私有的,“实例”,非静态的bool方法。 所有这个方法都返回一个值。 没有其他的。 我将如何拦截对此方法的调用,更改它的IL OpCodes /方法体,或将其重定向到额外的,重写或派生的方法。 我不想反编译第三方DLL,手动更改源,并重新编译它。 我也不想将程序集保存到磁盘,因为这也涉及使用“重新编译”的程序集而不是原始程序集。 我基本上希望能够使用原始的dll – 没有替换或文件更改。 我只想做我上面提到的事情。 有没有办法解决这个问题? 如果是这样,你可以详细说明或发布参考/教程/等。 另外,我知道虚拟,覆盖和新的修饰符,但请记住我:没有所说的第三方dll的源,无法访问源,不想用dotPeek和重新编译等东西进行反编译。 谢谢! 编辑:我忘了提及基础架构的其余部分:MainProgram加载ThirdPartyDLL。 MainProgram还加载MyPluginDLL。 我正在尝试从MyPluginDLL更改ThirdPartyDLL中的方法,以便当MainProgram调用所述方法时,它将调用更改的方法。 我希望能够在不保存新assembly并使用新assembly重新启动MainProgram的情况下执行此操作。 基本上,我想在启动时或MainProgram运行时执行此操作。