Hi,

http://groups.google.com/group/mono-cecil/browse_thread/thread/92097b926aaea341/0b33d546b1a1c856?lnk=gst&q=OptimizeMacros#0b33d546b1a1c856

Jb

On Mar 25, 2012, at 3:22 AM, piba wrote:

> Hi all,
> 
> Im using mono-cecil to modify a .xap Silverlight5 application. But
> when inserting new instructions after saving and reloading the a
> operand for a brtrue.s is 'lost'.. It seams to be a very specific
> scenario in which the problem occurs..
> 
> If i modify any line of the original code and then try to modify using
> Cecil, the problem does not happen.
> If i dont import a function the problem does not happen..
> 
> The code should insert a WriteLine before exiting the method with a
> RET instruction. (I also need to modify the existing instructions to
> point not to the RET but to my writeline.. but to simplify the issue
> this not done in the code below)
> 
> So now im kinda lost in why this happens, am i missing something or is
> it something else?
> 
> Below both the class to be modified, and the code that modifies it.
> 
> Thanks for everyone who can tell what might be wrong in my code.
> With kind regards,
> PiBa
> 
>>> the code modifying the original dll which is in a DotNet4 C# project:
> public static void ComputeOffsets(MethodBody body)
>    {
>      var offset = 0;
>      foreach (var instruction in body.Instructions)
>      {
>        instruction.Offset = offset;
>        offset += instruction.GetSize();
>      }
>    }
>    public static MethodDefinition findMethodDefinition(String
> sysLibFolder, String typeFullName, String MethodName, String[]
> parameters)
>    {
>      // retrieve system library that contains the debug object
> 
>      AssemblyDefinition systemLib =
> AssemblyDefinition.ReadAssembly(sysLibFolder);
>      bool typeFound;
>      foreach (TypeDefinition type in systemLib.Modules[0].Types)
>      {
>        if (type.FullName == typeFullName)
>        {
>          typeFound = true;
>          foreach (MethodDefinition meth in type.Methods)
>          {
>            if ((meth.Name == MethodName) && (meth.Parameters.Count ==
> parameters.Length))
>            {
>              bool OK = true;
>              for (int i = 0; i < parameters.Length; i++)
>              {
>                if (meth.Parameters[i].ParameterType.ToString() !=
> parameters[i])
>                {
>                  OK = false;
>                  break;
>                }
>              }
>              if (OK)
>              {
>                return meth;
>              }
>            }
>          }
>        }
>      }
>      return null;
>    }
>    private void button5_Click(object sender, EventArgs e)
>    {
>      string sysLibFolder = @"C:\Program Files (x86)\Microsoft
> Silverlight\5.0.61118.0\system.dll";
>      MethodDefinition writeLineMethod =
> findMethodDefinition(sysLibFolder, "System.Diagnostics.Debug",
> "WriteLine", new String[] { "System.String" });
> 
>      String testFile = @"C:\SilverlightApplicationTestApp\Bin\Release
> \SilverlightApplicationTestApp.dll";
>      AssemblyDefinition injectLibrary =
> AssemblyDefinition.ReadAssembly(testFile);
>      ShowTree(injectLibrary);
>      foreach (TypeDefinition type in injectLibrary.MainModule.Types)
>      {
>        foreach (MethodDefinition meth in type.Methods)
>        {
>          if (meth.Name == "OnUpdateSourceOnChangeChanged")
>          {
>            ILProcessor worker = meth.Body.GetILProcessor();
> 
>            MethodReference writeLineMR =
> injectLibrary.MainModule.Import(writeLineMethod);
>            //insert instruction before RET
>            Instruction inst = meth.Body.Instructions[0];
>            while (inst != null)
>            {
>              if (inst.OpCode == OpCodes.Ret)
>              {
>                Instruction retins = inst;
>                Instruction startInst = worker.Create(OpCodes.Ldstr,
> type.Name);
>                worker.InsertBefore(retins, startInst);
>                worker.InsertBefore(retins,
> worker.Create(OpCodes.Call, writeLineMR));
>              }
>              inst = inst.Next;
>            };
> 
>            ComputeOffsets(meth.Body);
>          }
>        }
>      }
>      ShowTree(injectLibrary);// Shows correct jump location
>      injectLibrary.Write(testFile + ".MODDED.DLL");
>      injectLibrary = AssemblyDefinition.ReadAssembly(testFile +
> ".MODDED.DLL");
>      ShowTree(injectLibrary);// Shows NO jump location
>    }
>  }
> 
> 
>>> The class to be modified in a Silverlight5 project:
>  public class BindingHelper
>  {
>    public static void OnUpdateSourceOnChangeChanged(DependencyObject
> obj, DependencyPropertyChangedEventArgs e)
>    {
>      TextBox textBox = obj as TextBox;
>      if ((bool)e.NewValue)
>      {
>        textBox.TextChanged += (new
> TextChangedEventHandler(BindingHelper.OnTextChanged));
>        textBox.DataContextChanged += (new
> DependencyPropertyChangedEventHandler(BindingHelper.OnDataContextChanged));
>        if (!BindingHelper.GetIsValidatingOnTextChanged(textBox))
>        {
>          textBox.LostFocus += (new
> RoutedEventHandler(BindingHelper.OnLostFocus));
>          textBox.GotFocus += (new
> RoutedEventHandler(BindingHelper.OnGotFocus));
>          return;
>        }
>      }
>      else
>      {
>        textBox.TextChanged -= (new
> TextChangedEventHandler(BindingHelper.OnTextChanged));
>        textBox.DataContextChanged -= (new
> DependencyPropertyChangedEventHandler(BindingHelper.OnDataContextChanged));
>        if (!BindingHelper.GetIsValidatingOnTextChanged(textBox))
>        {
>          textBox.LostFocus -= (new
> RoutedEventHandler(BindingHelper.OnLostFocus));
>          textBox.GotFocus -= (new
> RoutedEventHandler(BindingHelper.OnGotFocus));
>        }
>      }
>    }
>    private static void OnTextChanged(object sender,
> TextChangedEventArgs evtargs)
>    {
>    }
>    private static void OnGotFocus(object sender, RoutedEventArgs e)
>    {
>    }
>    private static void OnLostFocus(object sender, RoutedEventArgs e)
>    {
>    }
>    private static void OnDataContextChanged(object sender,
> DependencyPropertyChangedEventArgs e)
>    {
>    }
>    private static bool GetIsValidatingOnTextChanged(TextBox textBox)
>    {
>      return true;
>    }
>    private static bool GetIsBindingHelperEnabled(TextBox textBox)
>    {
>      return true;
>    }
>  }
> 
> -- 
> --
> mono-cecil

-- 
--
mono-cecil

Reply via email to