public
static
void
AutoWeave()
{
var
assemblies = BuildManager.GetReferencedAssemblies();
var
result =
assemblies.Cast<Assembly>().Where(assembly =>!assembly.FullName.StartsWith(
"System."
, StringComparison.OrdinalIgnoreCase));
Weave(result);
}
private
static
void
Weave(IEnumerable<Assembly> assemblyList)
{
//assemblyList要注入的程序集列表。
foreach
(
var
item
in
assemblyList)
{
var
filepath = item.CodeBase.Substring(8, item.CodeBase.Length - 8);
//读取程序集
var
assembly = AssemblyDefinition.ReadAssembly(filepath);
//获取WeaveSign类型的类型注入标记
var
types = assembly.MainModule.Types.Where(n => n.CustomAttributes.Any(y => y.AttributeType.Resolve().Name ==
"WeaveSign"
));
foreach
(
var
type
in
types)
{
foreach
(
var
method
in
type.Methods)
{
//获取WeaveAction类型的方法注入标记
var
attrs =
method.CustomAttributes.Where(y => y.AttributeType.Resolve().BaseType.Name ==
"WeaveAction"
);
foreach
(
var
attr
in
attrs)
{
//解析类型
var
resolve = attr.AttributeType.Resolve();
//获取IL容器
var
ilProcessor = method.Body.GetILProcessor();
var
firstInstruction = ilProcessor.Body.Instructions.First();
//找到标记类型的OnActionBefore方法。
var
onActionBefore = resolve.GetMethods().Single(n => n.Name ==
"OnActionBefore"
);
//创建System.Reflection.MethodBase.GetCurrentMethod()方法引用
var
mfReference=assembly.MainModule.Import(
typeof
(System.Reflection.MethodBase).GetMethod(
"GetCurrentMethod"
));
//注入到IL(调用GetCurrentMethod,入栈)
ilProcessor.InsertBefore(firstInstruction,
ilProcessor.Create(OpCodes.Call,mfReference));
//创建调用(call)标记类型的方法OnActionBefore
ilProcessor.InsertBefore(firstInstruction, ilProcessor.Create(OpCodes.Call, onActionBefore));
}
}
}
if
(types.Any())
{
//写入程序集
assembly.Write(filepath);
}
}
}