我想问一下是否有可能以某种方式将C#代码注入到现有的* .exe文件中,该文件也是用C#编写的,而不反编译。
换句话说,我试图做一个"扩展"已经存在的C#程序,但我想修改它而不需要使用" base"代码(。* exe文件)。
有没有办法实现这个目标?或者是修改基本代码的方法,类和/或添加扩展所需的反编译过程等等?
答案 0 :(得分:0)
您可以使用Mono.Cecil或Microsoft CCI project等框架来实现它。这些框架允许您阅读&修改/注入IL。但是,学习这些框架和IL代码的使用并不容易。
认为可以在FluentIL之上构建的库Mono.Cecil为IL代码提供了C#包装器。它没有对组件进行反编译而是加载它,注入组件可以使用注入的代码写入/生成一个新组件。
这是我以前注入的样本"空检查代码"在参数在项目汇编后编译中用[NotNull]
标记的方法中。
var assembly = AssemblyDefinition.ReadAssembly(SourceAssemblyPath);
var module = assembly.MainModule;
var q = from type in module.Types
from method in type.Methods
from parameter in method.Parameters
where parameter.HasCustomAttributes
from attribute in parameter.CustomAttributes
where attribute.AttributeType.FullName == NotNullAttribute.FullName
select new { Method = method, Parameter = parameter };
foreach (var item in q)
{
item.Method.InsertBefore()
.Ldarg(item.Parameter.Name)
.IfNull()
.Throw<ArgumentNullException>()
.EndIf();
}
SourceAssemblyPath = SourceAssemblyPath.Replace("\\debug\\", "\\release\\");
assembly.Write(SourceAssemblyPath, new WriterParameters { WriteSymbols = false });