本文整理汇总了C#中Mono.Cecil.Cil.MethodBody类的典型用法代码示例。如果您正苦于以下问题:C# MethodBody类的具体用法?C# MethodBody怎么用?C# MethodBody使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
MethodBody类属于Mono.Cecil.Cil命名空间,在下文中一共展示了MethodBody类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C#代码示例。
示例1: RunInternal
protected BlockStatement RunInternal(MethodBody body, BlockStatement block, ILanguage language)
{
try
{
if (body.Instructions.Count != 0 || body.Method.IsJustDecompileGenerated)
{
foreach (IDecompilationStep step in steps)
{
if (language != null && language.IsStopped)
{
break;
}
block = step.Process(Context, block);
}
}
}
finally
{
if (Context.MethodContext.IsMethodBodyChanged)
{
body.Method.RefreshBody();
}
}
return block;
}
开发者ID:is00hcw,项目名称:JustDecompileEngine,代码行数:27,代码来源:DecompilationPipeline.cs
示例2: EmitArchsInit
private static void EmitArchsInit(MethodBody body, FieldReference archRef, Action<Instruction> emit)
{
var module = body.Method.Module;
GenericInstanceType dictStrStrRef = (GenericInstanceType)archRef.FieldType;
TypeReference dictOpenRef = dictStrStrRef.ElementType;
GenericInstanceType iEqCompStrRef = new GenericInstanceType(module.Import(typeof(IEqualityComparer<>)));
iEqCompStrRef.GenericArguments.Add(dictOpenRef.GenericParameters[0]);
MethodReference dictStrStrCtor = CecilUtils.ImportInstanceMethodRef(module, dictStrStrRef, ".ctor", null, iEqCompStrRef);
MethodReference dictAddRef = CecilUtils.ImportInstanceMethodRef(module, dictStrStrRef, "Add", null, dictOpenRef.GenericParameters[0], dictOpenRef.GenericParameters[1]);
// Variables
body.Variables.Add(new VariableDefinition(dictStrStrRef));
int varIdx = body.Variables.Count - 1;
Instruction varSt = CecilUtils.ShortestStloc(varIdx);
Instruction varLd = CecilUtils.ShortestLdloc(varIdx);
emit(Instruction.Create(OpCodes.Ldnull));
emit(Instruction.Create(OpCodes.Newobj, dictStrStrCtor));
emit(varSt.Clone());
emit(varLd.Clone());
emit(Instruction.Create(OpCodes.Stsfld, archRef));
Action<string, string> emitAddPair = (k, v) =>
{
emit(varLd.Clone());
emit(Instruction.Create(OpCodes.Ldstr, k));
emit(Instruction.Create(OpCodes.Ldstr, v));
emit(Instruction.Create(OpCodes.Callvirt, dictAddRef));
};
emitAddPair("x86", "Win32");
emitAddPair("AMD64", "x64");
emitAddPair("IA64", "Itanium");
emitAddPair("ARM", "WinCE");
}
开发者ID:poizan42,项目名称:SQLitePostProcess,代码行数:33,代码来源:Program.cs
示例3: ProxyMethod
protected override void ProxyMethod(MethodBody body, MethodReference proceedTargetMethod)
{
// Create base call
if (!Method.IsAbstract)
{
callBaseMethod = new MethodDefinition(Name + "$Base", MethodAttributes.Private, Method.ReturnType);
Method.CopyParameters(callBaseMethod);
Method.CopyGenericParameters(callBaseMethod);
callBaseMethod.Body.Emit(il =>
{
il.Emit(OpCodes.Ldarg_0);
for (var i = 0; i < Method.Parameters.Count; i++)
{
il.Emit(OpCodes.Ldarg, (short)i + 1);
}
var methodReference = GetProceedMethodTarget();
if (Method.GenericParameters.Count > 0)
methodReference = methodReference.MakeGenericMethod(callBaseMethod.GenericParameters.ToArray());
il.Emit(OpCodes.Call, methodReference);
il.Emit(OpCodes.Ret);
});
ClassWeaver.ProxyType.Methods.Add(callBaseMethod);
}
base.ProxyMethod(body, proceedTargetMethod);
}
开发者ID:kswoll,项目名称:sexy-proxy,代码行数:25,代码来源:NonInterfaceClassWeaver.cs
示例4: VisitMethodBody
public override void VisitMethodBody (MethodBody body)
{
MethodDefinition meth = body.Method;
MethodBody methBody = body;
BinaryReader br = m_reflectReader.Module.ImageReader.MetadataReader.GetDataReader (meth.RVA);
// lets read the method
int flags = br.ReadByte ();
switch (flags & 0x3) {
case (int) MethodHeader.TinyFormat :
methBody.CodeSize = flags >> 2;
methBody.MaxStack = 8;
ReadCilBody (methBody, br);
break;
case (int) MethodHeader.FatFormat :
br.BaseStream.Position--;
int fatflags = br.ReadUInt16 ();
//int headersize = (fatflags >> 12) & 0xf;
methBody.MaxStack = br.ReadUInt16 ();
methBody.CodeSize = br.ReadInt32 ();
methBody.LocalVarToken = br.ReadInt32 ();
body.InitLocals = (fatflags & (int) MethodHeader.InitLocals) != 0;
if (methBody.LocalVarToken != 0)
VisitVariableDefinitionCollection (methBody.Variables);
ReadCilBody (methBody, br);
if ((fatflags & (int) MethodHeader.MoreSects) != 0)
ReadSection (methBody, br);
break;
}
}
开发者ID:transformersprimeabcxyz,项目名称:monodevelop-1,代码行数:30,代码来源:CodeReader.cs
示例5: Replace
public void Replace(MethodBody currentBody, ICollection<MethodReference> modifiedItems)
{
var invalidCalls = _callFilter.GetInvalidCalls(currentBody, modifiedItems);
if (invalidCalls.Count == 0)
return;
var currentInstructions = currentBody.Instructions.Cast<Instruction>().ToArray();
var stackCtor = _targetModule.ImportConstructor<Stack<object>>(new Type[0]);
var IL = currentBody.CilWorker;
var targetMethod = currentBody.Method;
var currentArgument = targetMethod.AddLocal<object>();
var currentArguments = targetMethod.AddLocal<Stack<object>>();
currentBody.Instructions.Clear();
// Create the stack that will hold the method arguments
IL.Emit(OpCodes.Newobj, stackCtor);
IL.Emit(OpCodes.Stloc, currentArguments);
foreach (var currentInstruction in currentInstructions)
{
var currentMethod = currentInstruction.Operand as MethodReference;
// Ignore any instructions that weren't affected by the
// interface extraction
if (currentMethod != null && invalidCalls.ContainsKey(currentMethod))
{
var context = new MethodContext(IL, currentArguments, currentMethod, currentArgument);
_replaceMethodCall.Replace(context, _targetModule);
}
IL.Append(currentInstruction);
}
}
开发者ID:philiplaureano,项目名称:Taiji,代码行数:34,代码来源:ReplaceMethodCalls.cs
示例6: TerminateMethodBody
public override void TerminateMethodBody(MethodBody body)
{
long pos = m_binaryWriter.BaseStream.Position;
if (body.Variables.Count > 0 || body.ExceptionHandlers.Count > 0
|| m_codeWriter.BaseStream.Length >= 64 || body.MaxStack > 8) {
MethodHeader header = MethodHeader.FatFormat;
if (body.InitLocals)
header |= MethodHeader.InitLocals;
if (body.ExceptionHandlers.Count > 0)
header |= MethodHeader.MoreSects;
m_binaryWriter.Write ((byte) header);
m_binaryWriter.Write ((byte) 0x30); // (header size / 4) << 4
m_binaryWriter.Write ((short) body.MaxStack);
m_binaryWriter.Write ((int) m_codeWriter.BaseStream.Length);
m_binaryWriter.Write (((int) TokenType.Signature | body.LocalVarToken));
WriteExceptionHandlerCollection (body.ExceptionHandlers);
} else
m_binaryWriter.Write ((byte) ((byte) MethodHeader.TinyFormat |
m_codeWriter.BaseStream.Length << 2));
m_binaryWriter.Write (m_codeWriter);
m_binaryWriter.QuadAlign ();
m_reflectWriter.MetadataWriter.AddData (
(int) (m_binaryWriter.BaseStream.Position - pos));
}
开发者ID:leftouterjoin,项目名称:loj-prj1,代码行数:30,代码来源:CodeWriter.cs
示例7: CreateScopes
void CreateScopes (MethodBody body, ScopeCollection scopes, SymbolToken localVarToken)
{
foreach (Scope s in scopes) {
int startOffset = s.Start.Offset;
int endOffset = s.End == body.Instructions.Outside ?
body.Instructions[body.Instructions.Count - 1].Offset + 1 :
s.End.Offset;
m_writer.OpenScope (startOffset);
m_writer.UsingNamespace (body.Method.DeclaringType.Namespace);
m_writer.OpenNamespace (body.Method.DeclaringType.Namespace);
int start = body.Instructions.IndexOf (s.Start);
int end = s.End == body.Instructions.Outside ?
body.Instructions.Count - 1 :
body.Instructions.IndexOf (s.End);
ArrayList instructions = CollectSequencePoints (body, start, end);
DefineSequencePoints (instructions);
CreateLocalVariable (s, startOffset, endOffset, localVarToken);
CreateScopes (body, s.Scopes, localVarToken);
m_writer.CloseNamespace ();
m_writer.CloseScope (endOffset);
}
}
开发者ID:pusp,项目名称:o2platform,代码行数:28,代码来源:PdbWriter.cs
示例8: DecompilationContext
internal DecompilationContext (MethodBody body, ControlFlowGraph cfg)
{
this.body = body;
this.method = body.Method;
this.variables = CloneCollection (body.Variables);
this.cfg = cfg;
}
开发者ID:transformersprimeabcxyz,项目名称:monodevelop-1,代码行数:7,代码来源:DecompilationContext.cs
示例9: CreateExplicitStub
/// <summary>
/// Create a new method in the declaring type of the given implicit implementation with the given name.
/// This method will call the implicit implementation.
/// </summary>
internal static MethodDefinition CreateExplicitStub(MethodDefinition implicitImpl, string name, MethodDefinition iMethod, bool avoidGenericParam)
{
// Create method
var newMethod = new MethodDefinition(name, implicitImpl.Attributes, implicitImpl.ReturnType);
newMethod.IsVirtual = false;
newMethod.IsAbstract = false;
newMethod.IsFinal = true;
// Clone generic parameters
foreach (var gp in implicitImpl.GenericParameters)
{
newMethod.GenericParameters.Add(new GenericParameter(gp.Name, newMethod));
}
// Update according to new context
var cloner = new TypeCloner(avoidGenericParam, implicitImpl.Module.TypeSystem);
newMethod.ReturnType = cloner.Get(implicitImpl.ReturnType, newMethod);
// Clone parameters
foreach (var p in iMethod.Parameters)
{
newMethod.Parameters.Add(new ParameterDefinition(p.Name, p.Attributes, cloner.Get(p.ParameterType, newMethod)));
}
// Add the method
var targetType = implicitImpl.DeclaringType;
targetType.Methods.Add(newMethod);
// Add override
newMethod.Overrides.Add(iMethod);
// Create method body
var body = new MethodBody(newMethod);
newMethod.Body = body;
var worker = body.GetILProcessor();
// Push this
worker.Emit(OpCodes.Ldarg, body.ThisParameter);
for (var i = 0; i < implicitImpl.Parameters.Count; i++)
{
var p = iMethod.Parameters[i];
var newMethodParam = newMethod.Parameters[i];
worker.Emit(OpCodes.Ldarg, newMethodParam);
if (/*avoidGenericParam &&*/ p.ParameterType.ContainsGenericParameter)
{
worker.Emit(OpCodes.Box, implicitImpl.Parameters[i].ParameterType);
}
}
worker.Emit(implicitImpl.IsVirtual ? OpCodes.Callvirt : OpCodes.Call, implicitImpl);
worker.Emit(OpCodes.Ret);
// Mark method reachable
if (implicitImpl.IsReachable)
{
newMethod.SetReachable(null);
}
return newMethod;
}
开发者ID:rfcclub,项目名称:dot42,代码行数:64,代码来源:InterfaceHelper.cs
示例10: SwapMethods
private static void SwapMethods(MethodBody body, IEnumerable<Instruction> oldInstructions, IDictionary<MethodReference, MethodReference> methodMap,
TypeDefinition targetDependency)
{
var IL = body.CilWorker;
foreach (var instruction in oldInstructions)
{
var opCode = instruction.OpCode;
if (opCode != OpCodes.Call && opCode != OpCodes.Callvirt)
{
IL.Append(instruction);
continue;
}
var currentMethod = instruction.Operand as MethodReference;
if (currentMethod == null || !methodMap.ContainsKey(currentMethod))
{
IL.Append(instruction);
continue;
}
if (currentMethod.DeclaringType != targetDependency)
{
IL.Append(instruction);
continue;
}
var interfaceMethod = methodMap[currentMethod];
instruction.Operand = interfaceMethod;
instruction.OpCode = OpCodes.Callvirt;
IL.Append(instruction);
}
}
开发者ID:philiplaureano,项目名称:Taiji,代码行数:33,代码来源:SwapMethodCalls.cs
示例11: Write
public void Write(MethodBody body, /*Telerik Authorship*/ MetadataToken methodToken, /*Telerik Authorship*/ MetadataToken localVarToken)
{
var method = new SourceMethod (body.Method);
var instructions = GetInstructions (body);
int count = instructions.Count;
if (count == 0)
return;
var offsets = new int [count];
var start_rows = new int [count];
var start_cols = new int [count];
SourceFile file;
Populate (instructions, offsets, start_rows, start_cols, out file);
var builder = writer.OpenMethod (file.CompilationUnit, 0, method);
for (int i = 0; i < count; i++)
builder.MarkSequencePoint (
offsets [i],
file.CompilationUnit.SourceFile,
start_rows [i],
start_cols [i],
false);
if (body.HasVariables)
AddVariables (body.Variables);
writer.CloseMethod ();
}
开发者ID:juancarlosbaezpozos,项目名称:JustDecompileEngine,代码行数:31,代码来源:MdbWriter.cs
示例12: VisitMethodBody
public void VisitMethodBody(MethodBody body)
{
this.MethodBody = body;
//VisitVariableDefinitionCollection(body.Variables);
//VisitInstructionCollection(body.Instructions);
//VisitExceptionHandlerCollection(body.ExceptionHandlers);
}
开发者ID:dbremner,项目名称:dotnet-testability-explorer,代码行数:7,代码来源:MethodVisitor.cs
示例13: Write
public void Write(MethodBody body, byte [][] variables)
{
CreateDocuments (body);
m_writer.OpenMethod (new SymbolToken ((int) body.Method.MetadataToken.ToUInt ()));
CreateScopes (body, body.Scopes, variables);
m_writer.CloseMethod ();
}
开发者ID:sidecut,项目名称:xaeios,代码行数:7,代码来源:PdbWriter.cs
示例14: ContainsCallTo
public static bool ContainsCallTo(MethodBody m,
string methodFullName)
{
return m.Instructions.Any(i =>
(i.OpCode == OpCodes.Call || i.OpCode == OpCodes.Callvirt) &&
((MethodReference)i.Operand).FullName == methodFullName);
}
开发者ID:migajek,项目名称:EyeDisposable,代码行数:7,代码来源:ILExtractor.cs
示例15: Write
public void Write(MethodBody body)
{
var method_token = body.Method.MetadataToken;
var sym_token = new SymbolToken (method_token.ToInt32 ());
var instructions = CollectInstructions (body);
if (instructions.Count == 0 && !body.HasVariables)
return;
writer.OpenMethod (sym_token);
DefineSequencePoints (instructions);
if (body.Scope != null)
WriteScope (body, body.Scope);
else
if (body.HasVariables)
{
var start_offset = 0;
var end_offset = body.CodeSize;
writer.OpenScope (start_offset);
DefineVariables (body, body.Variables, start_offset, end_offset);
writer.CloseScope (end_offset);
}
if (body.IteratorType != null)
DefineIteratorType (sym_token, body.IteratorType.Name);
if (body.iterator_scopes != null)
DefineIteratorScopes (sym_token, body.IteratorScopes, body.CodeSize);
writer.CloseMethod ();
}
开发者ID:atykhyy,项目名称:cecil,代码行数:34,代码来源:PdbWriter.cs
示例16: CreateDefaultCtor
/// <summary>
/// Create the Ctor
/// </summary>
private static void CreateDefaultCtor(ReachableContext reachableContext, TypeDefinition type)
{
var typeSystem = type.Module.TypeSystem;
var ctor = new MethodDefinition(".ctor", MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName, typeSystem.Void);
ctor.DeclaringType = type;
var body = new MethodBody(ctor);
body.InitLocals = true;
ctor.Body = body;
// Prepare code
var seq = new ILSequence();
seq.Emit(OpCodes.Nop);
seq.Emit(OpCodes.Ret);
// Append ret sequence
seq.AppendTo(body);
// Update offsets
body.ComputeOffsets();
// Add ctor
type.Methods.Add(ctor);
ctor.SetReachable(reachableContext);
}
开发者ID:Xtremrules,项目名称:dot42,代码行数:28,代码来源:StructDefaultCtorsAndDefaultField.cs
示例17: Write
public void Write (MethodBody body)
{
CreateDocuments (body);
m_writer.OpenMethod (new SymbolToken ((int) body.Method.MetadataToken.ToUInt ()));
CreateScopes (body, body.Scopes, new SymbolToken (body.LocalVarToken));
m_writer.CloseMethod ();
}
开发者ID:pusp,项目名称:o2platform,代码行数:7,代码来源:PdbWriter.cs
示例18: Analyze
public void Analyze(MethodBody body, NodeBase analyzedNode)
{
if (analyzedNode is MethodNode)
((MethodNode)analyzedNode).CyclomaticComplexity = 0;
if (body == null)
return;
foreach (var instruction in body.Instructions) {
// IL cyclomatic complexity
if (instruction.OpCode.FlowControl == FlowControl.Cond_Branch && analyzedNode is MethodNode)
((MethodNode)analyzedNode).CyclomaticComplexity++;
var operand = ReadOperand(instruction);
if (operand is MethodReference) {
var md = ((MethodReference)operand).Resolve();
if (md != null && assemblies.Contains(md.DeclaringType.Module.Assembly) && mappings.cecilMappings.ContainsKey(md)) {
if (md.IsGetter || md.IsSetter) {
var propertyNode = mappings.propertyMappings[(IProperty)mappings.cecilMappings[md]];
analyzedNode.AddRelationship(propertyNode);
} else {
var methodNode = mappings.methodMappings[(IMethod)mappings.cecilMappings[md]];
analyzedNode.AddRelationship(methodNode);
}
}
} else if (operand is FieldReference) {
var fd = ((FieldReference)operand).Resolve();
if (fd != null && assemblies.Contains(fd.DeclaringType.Module.Assembly) && mappings.cecilMappings.ContainsKey(fd)) {
var fieldNode = mappings.fieldMappings[(IField)mappings.cecilMappings[fd]];
analyzedNode.AddRelationship(fieldNode);
}
}
}
}
开发者ID:pluraldj,项目名称:SharpDevelop,代码行数:35,代码来源:ILAnalyzer.cs
示例19: WeaveDependencyProperty
private void WeaveDependencyProperty(MethodBody staticCtorBody, FieldReference field, PropertyDefinition property)
{
var assembly = property.DeclaringType.Module.Assembly;
var propertyType = assembly.ImportType(Type.GetType(property.PropertyType.FullName));
var getTypeFromHandle = assembly.ImportMethod(typeof(Type).GetMethod("GetTypeFromHandle"));
var register = assembly.ImportMethod(typeof(DependencyProperty).GetMethod("Register", new[] { typeof(string), typeof(Type), typeof(Type) }));
// ignore previously weaved DPs
if (staticCtorBody.Instructions.Any(i => i.Operand != null && i.Operand.ToString() == field.ToString()))
{
return;
}
var ret = staticCtorBody.Instructions.Last();
if (ret.OpCode != OpCodes.Ret)
throw new InvalidOperationException("The last instruction should be OpCode.Ret");
HasChanges = true;
var proc = staticCtorBody.GetILProcessor();
proc.InsertBefore(ret, proc.Create(OpCodes.Ldstr, property.Name));
proc.InsertBefore(ret, proc.Create(OpCodes.Ldtoken, propertyType));
proc.InsertBefore(ret, proc.Create(OpCodes.Call, getTypeFromHandle));
proc.InsertBefore(ret, proc.Create(OpCodes.Ldtoken, property.DeclaringType));
proc.InsertBefore(ret, proc.Create(OpCodes.Call, getTypeFromHandle));
proc.InsertBefore(ret, proc.Create(OpCodes.Call, register));
proc.InsertBefore(ret, proc.Create(OpCodes.Stsfld, field));
}
开发者ID:bling,项目名称:AOPDemo,代码行数:28,代码来源:DependencyPropertyWeaver.cs
示例20: UpdateCallsToGetCurrentClassLogger
private void UpdateCallsToGetCurrentClassLogger(MethodBody ctorBody)
{
// Convert this:
//
// call class [Catel.Core]Catel.Logging.ILog [Catel.Core]Catel.Logging.LogManager::GetCurrentClassLogger()
// stsfld class [Catel.Core]Catel.Logging.ILog Catel.Fody.TestAssembly.LoggingClass::AutoLog
//
// into this:
//
// ldtoken Catel.Fody.TestAssembly.LoggingClass
// call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
// call class [Catel.Core]Catel.Logging.ILog [Catel.Core]Catel.Logging.LogManager::GetLogger(class [mscorlib]System.Type)
// stsfld class [Catel.Core]Catel.Logging.ILog Catel.Fody.TestAssembly.LoggingClass::ManualLog
var type = ctorBody.Method.DeclaringType;
var instructions = ctorBody.Instructions;
for (var i = 0; i < instructions.Count; i++)
{
var instruction = instructions[i];
var methodReference = instruction.Operand as MethodReference;
if (methodReference != null)
{
FodyEnvironment.LogDebug($"Weaving auto log to specific log for '{type.FullName}'");
if (string.Equals(methodReference.Name, "GetCurrentClassLogger"))
{
// We have a possible match
var getLoggerMethod = GetGetLoggerMethod(methodReference.DeclaringType);
if (getLoggerMethod == null)
{
var point = instruction.SequencePoint;
var message = $"Cannot change method call for log '{type.FullName}', the GetLogger(type) method does not exist on the calling type (try to use LogManager.GetCurrentClassLogger())";
if (point != null)
{
FodyEnvironment.LogWarningPoint(message, point);
}
else
{
FodyEnvironment.LogWarning(message);
}
continue;
}
var getTypeFromHandle = type.Module.GetMethodAndImport("GetTypeFromHandle");
instructions.RemoveAt(i);
instructions.Insert(i,
Instruction.Create(OpCodes.Ldtoken, type),
Instruction.Create(OpCodes.Call, getTypeFromHandle),
Instruction.Create(OpCodes.Call, type.Module.Import(getLoggerMethod)));
}
}
}
}
开发者ID:Catel,项目名称:Catel.Fody,代码行数:59,代码来源:LoggingWeaver.cs
注:本文中的Mono.Cecil.Cil.MethodBody类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论