The error originates from: https://github.com/jbevain/cecil/blob/0a2f2944638c13987d8a2318bc34bd64fdac55fd/Mono.Cecil/TypeDefinition.cs#L590
Which points at you removing the magic instance field of an enum type that Cecil uses to find out what primitive type the enum is. (Don't remove this field :) ) Jb On Tue, Apr 14, 2020 at 8:05 PM Rick Martin <[email protected]> wrote: > Hiya :) > Thanks for the reply, yes I did some reading and ended up finding that > some methods are called with callvirt, or ldftn/ldvirtftn in some cases. I > also ran in to a case where a usage was in a nested type, and my original > code wasn't searching through the nesting. > Problem solved. > > I'm trying to apply the same logic to find fields which are only written > to and never read. I'm whitelisting fields by finding all reads, assuming > that Ldfld, Ldflda, Ldsfld and Ldsflda are the only Opcodes I should expect > for reading. > > private static IEnumerable<FieldReference> > GetFieldReadsInProperties(IEnumerable<PropertyDefinition> properties) > { > var getMethods = properties.Select(p => p.GetMethod).Where(m => m != > null); > var setMethods = properties.Select(p => p.SetMethod).Where(m => m != > null); > > var allMethods = getMethods.Concat(setMethods).Where(m => m.HasBody); > > return allMethods > .SelectMany(m => m.Body.Instructions) > .Where(i => ReadOpCodes.Any(o => i.OpCode == o)) > .Select(f => f.Operand as FieldReference) > .DistinctBy(f => f.FullName); > } > > private static IEnumerable<FieldReference> > GetFieldReadsInMethods(IEnumerable<MethodDefinition> methods) > { > return methods.Where(m => m.HasBody) > .SelectMany(m => m.Body.Instructions) > .Where(i => ReadOpCodes.Any(o => i.OpCode == o)) > .Select(f => f.Operand as FieldReference) > .DistinctBy(f => f.FullName); > } > > private static OpCode[] ReadOpCodes = new[] { OpCodes.Ldfld, > OpCodes.Ldflda, OpCodes.Ldsfld, OpCodes.Ldsflda }; > > This seems to be ok, but it trips up with enum fields, again with a vague > error :D > > System.ArgumentException > HResult=0x80070057 > Message=Value does not fall within the expected range. > Source=Mono.Cecil > StackTrace: > at Mono.Cecil.Mixin.GetEnumUnderlyingType(TypeDefinition self) in > <redacted>\cecil-master\Mono.Cecil\TypeDefinition.cs:line 600 > at Mono.Cecil.MetadataBuilder.GetConstantType(TypeReference > constant_type, Object constant) in > <redacted>\cecil-master\Mono.Cecil\AssemblyWriter.cs:line 1882 > at Mono.Cecil.MetadataBuilder.AddConstant(IConstantProvider owner, > TypeReference type) in > <redacted>\cecil-master\Mono.Cecil\AssemblyWriter.cs:line 1864 > at Mono.Cecil.MetadataBuilder.AddField(FieldDefinition field) in > <redacted>\cecil-master\Mono.Cecil\AssemblyWriter.cs:line 1624 > at Mono.Cecil.MetadataBuilder.AddFields(TypeDefinition type) in > <redacted>\cecil-master\Mono.Cecil\AssemblyWriter.cs:line 1602 > at Mono.Cecil.MetadataBuilder.AddType(TypeDefinition type) in > <redacted>\cecil-master\Mono.Cecil\AssemblyWriter.cs:line 1437 > at Mono.Cecil.MetadataBuilder.AddNestedTypes(TypeDefinition type) in > <redacted>\cecil-master\Mono.Cecil\AssemblyWriter.cs:line 1592 > at Mono.Cecil.MetadataBuilder.AddType(TypeDefinition type) in > <redacted>\cecil-master\Mono.Cecil\AssemblyWriter.cs:line 1455 > at Mono.Cecil.MetadataBuilder.AddTypes() in > <redacted>\cecil-master\Mono.Cecil\AssemblyWriter.cs:line 1413 > at Mono.Cecil.MetadataBuilder.BuildTypes() in > <redacted>\cecil-master\Mono.Cecil\AssemblyWriter.cs:line 1266 > at Mono.Cecil.MetadataBuilder.BuildModule() in > <redacted>\cecil-master\Mono.Cecil\AssemblyWriter.cs:line 1036 > at Mono.Cecil.MetadataBuilder.BuildMetadata() in > <redacted>\cecil-master\Mono.Cecil\AssemblyWriter.cs:line 1006 > at Mono.Cecil.ModuleWriter.<>c.<BuildMetadata>b__2_0(MetadataBuilder > builder, MetadataReader _) in > <redacted>\cecil-master\Mono.Cecil\AssemblyWriter.cs:line 144 > at Mono.Cecil.ModuleDefinition.Read[TItem,TRet](TItem item, Func`3 > read) in <redacted>\cecil-master\Mono.Cecil\ModuleDefinition.cs:line 950 > at Mono.Cecil.ModuleWriter.BuildMetadata(ModuleDefinition module, > MetadataBuilder metadata) in > <redacted>\cecil-master\Mono.Cecil\AssemblyWriter.cs:line 143 > at Mono.Cecil.ModuleWriter.Write(ModuleDefinition module, Disposable`1 > stream, WriterParameters parameters) in > <redacted>\cecil-master\Mono.Cecil\AssemblyWriter.cs:line 119 > at Mono.Cecil.ModuleWriter.WriteModule(ModuleDefinition module, > Disposable`1 stream, WriterParameters parameters) in > <redacted>\cecil-master\Mono.Cecil\AssemblyWriter.cs:line 78 > at Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters > parameters) in <redacted>\cecil-master\Mono.Cecil\ModuleDefinition.cs:line > 1139 > at Mono.Cecil.AssemblyDefinition.Write(String fileName, > WriterParameters parameters) in > <redacted>\cecil-master\Mono.Cecil\AssemblyDefinition.cs:line 161 > at Mono.Cecil.AssemblyDefinition.Write(String fileName) in > <redacted>\cecil-master\Mono.Cecil\AssemblyDefinition.cs:line 156 > at <redacted>(String[] args) in <redacted> > > Guess I need to do some more reading :D > > > On Tuesday, 14 April 2020 17:44:42 UTC+1, Jb Evain wrote: >> >> Hey Rick, >> >> Yes, it seems you missed some usages :) >> >> In the IL, the method call be called using callvirt for instance, or >> referenced by a ldtoken. >> >> Unfortunately the error is not very explicit, but you're completely >> right, you don't need to import a reference here. It just means that Cecil >> is seeing a reference to a stray method that is without a module. >> >> Jb >> > -- > -- > -- > mono-cecil > --- > You received this message because you are subscribed to the Google Groups > "mono-cecil" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/mono-cecil/5a43d2b0-918d-4249-beff-e667bc80026d%40googlegroups.com > <https://groups.google.com/d/msgid/mono-cecil/5a43d2b0-918d-4249-beff-e667bc80026d%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- -- -- mono-cecil --- You received this message because you are subscribed to the Google Groups "mono-cecil" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/mono-cecil/CABsHH9KsSmGpq4a%3Df4gkCVXeAsWnXNpZJypPJ6QdmiVTDV1dJw%40mail.gmail.com.
