No wonder, you have ignored references to the members of your types. Also, use peverify (it's in Microsoft SDKs - the full path on my machine: C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin) to find out exactly what's wrong with your application.
2011/5/26 Paul <[email protected]> > Here's what I came up with, but it results in an invalid program: > > private static void SwapTypes(TypeReference search, > TypeReference replace) > { > foreach (TypeDefinition t in Module.Types) > { > foreach (FieldDefinition f in t.Fields) > { > if (f.FieldType == search) > { > f.FieldType = replace; > } > } > foreach (MethodDefinition m in t.Methods) > { > if (m.ReturnType.ReturnType == > search) > { > m.ReturnType.ReturnType = > replace; > } > foreach (ParameterDefinition p in > m.Parameters) > { > if (p.ParameterType == > search) > { > p.ParameterType = > replace; > } > } > if (m.HasBody) > { > foreach (VariableDefinition > v in m.Body.Variables) > { > if (v.VariableType > == search) > { > > v.VariableType = replace; > } > } > foreach (Instruction i in > m.Body.Instructions) > { > if (i.Operand is > TypeReference && (TypeReference)i.Operand == search) > { > i.Operand = > replace; > } > } > } > } > } > } > > > Thanks, > Paul Buonopane > > > > On Thu, May 26, 2011 at 5:21 AM, Gábor Kozár <[email protected]> wrote: > > It most certainly is possible, but it'll be not too easy to code. > Basically > > what you need to do is find all references to Lightning1 or its members > in > > the assembly you're processing, and replace them with the appropriate > > reference to Lightning2, or its members. > > Go through all types in the assembly, and check their base type, and the > > generic arguments of the base type. Then go through all the methods in > the > > type (including the property get_* and set_* methods - maybe even the > event > > add_* and remove_* methods), fix their parameter and local variable > types, > > then iterate through the instructions to find all references to > Lightning1 > > or its member. > > I believe the easiest way to achieve this would be to check the Operand > of > > each instruction, and see if it's a TypeReference. If it is, check if it > is > > Lightning1, and also check its generic arguments. If it's not a > > TypeReference, see if it's a MemberReference whose DeclaringType is > > Lightning1, or has Lightning1 as a generic argument. > > If Lightning1 is an attribute type, make sure to also check the > > CustomAttributes of all eligible members. I think that'll cover > everything. > > I'm afraid I don't know any easier way to achieve this. Good luck! > > 2011/5/26 Paul Buonopane <[email protected]> > >> > >> Is it possible to inject a type in another's place? For example, if I > >> have Lighting1 and Lighting2, the two being almost identical, could I > inject > >> Lighting2 in place of Lighting1? If so, what would it entail? -- > >> -- > >> mono-cecil > > > > -- > > -- > > mono-cecil > > -- > -- > mono-cecil -- -- mono-cecil
