cecil icon indicating copy to clipboard operation
cecil copied to clipboard

Unable to round-trip with unresolved enum constants

Open sbomer opened this issue 4 years ago • 6 comments

It looks like this was discussed in https://github.com/jbevain/cecil/issues/236, and implemented for attributes, but not fields or default parameters.

repro.tar.gz

    static void Method(MyEnum e = MyEnum.B)
    {
    }
var a = ModuleDefinition.ReadModule("./cecil_const/bin/Debug/netstandard2.0/cecil_const.dll");
a.Write("out.dll");
Unhandled exception. Mono.Cecil.AssemblyResolutionException: Failed to resolve assembly: 'const_ref, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
   at Mono.Cecil.BaseAssemblyResolver.Resolve(AssemblyNameReference name, ReaderParameters parameters)
   at Mono.Cecil.BaseAssemblyResolver.Resolve(AssemblyNameReference name)
   at Mono.Cecil.DefaultAssemblyResolver.Resolve(AssemblyNameReference name)
   at Mono.Cecil.MetadataResolver.Resolve(TypeReference type)
   at Mono.Cecil.ModuleDefinition.Resolve(TypeReference type)
   at Mono.Cecil.TypeReference.Resolve()
   at Mono.Cecil.Mixin.CheckedResolve(TypeReference self)
   at Mono.Cecil.MetadataBuilder.GetConstantType(TypeReference constant_type, Object constant)
   at Mono.Cecil.MetadataBuilder.AddConstant(IConstantProvider owner, TypeReference type)
   at Mono.Cecil.MetadataBuilder.AddParameter(UInt16 sequence, ParameterDefinition parameter, ParamTable table)
   at Mono.Cecil.MetadataBuilder.AddParameters(MethodDefinition method)
   at Mono.Cecil.MetadataBuilder.AddMethod(MethodDefinition method)
   at Mono.Cecil.MetadataBuilder.AddMethods(TypeDefinition type)
   at Mono.Cecil.MetadataBuilder.AddType(TypeDefinition type)
   at Mono.Cecil.MetadataBuilder.AddTypes()
   at Mono.Cecil.MetadataBuilder.BuildTypes()
   at Mono.Cecil.MetadataBuilder.BuildModule()
   at Mono.Cecil.MetadataBuilder.BuildMetadata()
   at Mono.Cecil.ModuleWriter.<>c.<BuildMetadata>b__2_0(MetadataBuilder builder, MetadataReader _)
   at Mono.Cecil.ModuleDefinition.Read[TItem,TRet](TItem item, Func`3 read)
   at Mono.Cecil.ModuleWriter.BuildMetadata(ModuleDefinition module, MetadataBuilder metadata)
   at Mono.Cecil.ModuleWriter.Write(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters)
   at Mono.Cecil.ModuleWriter.WriteModule(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters)
   at Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters parameters)
   at Mono.Cecil.ModuleDefinition.Write(String fileName)

We are seeing what looks like the same issue in https://github.com/dotnet/sdk/issues/3668#issuecomment-642836981.

sbomer avatar Jun 11 '20 20:06 sbomer

Hey @sbomer, I'm happy to look at what it would take to bring the same optimization as custom attributes (copying the blob instead of deconstructing the constant value), but in the context of the linker the reference should be resolvable for everything to work.

jbevain avatar Jun 11 '20 21:06 jbevain

Thanks - we're still trying to figure out why the reference was missing, but I thought I'd file the issue about the optimization as well.

sbomer avatar Jun 11 '20 21:06 sbomer

Some more context: The unresolved reference in the case we hit looks like it was part of a code path that only lights up when an optional package is added and used in the app. Without that package, the dangling reference doesn't cause any problems at runtime, but it still prevents the linker from writing this assembly (when trying to keep everything in it). We do have a workaround, but it would be great if round-tripping worked for scenarios like this.

sbomer avatar Jul 01 '20 22:07 sbomer

hi,sbomer. I encountered this problem. What should I do to resolve it?

Pcookie avatar Jul 21 '23 08:07 Pcookie

Some more context: The unresolved reference in the case we hit looks like it was part of a code path that only lights up when an optional package is added and used in the app. Without that package, the dangling reference doesn't cause any problems at runtime, but it still prevents the linker from writing this assembly (when trying to keep everything in it). We do have a workaround, but it would be great if round-tripping worked for scenarios like this.

I encountered this problem. What should I do to resolve it?

Pcookie avatar Jul 21 '23 08:07 Pcookie

I've encountered the same issue. How should I resolve it?


Mono.Cecil.AssemblyResolutionException: Failed to resolve assembly: 'UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
  at Mono.Cecil.BaseAssemblyResolver.Resolve (Mono.Cecil.AssemblyNameReference name, Mono.Cecil.ReaderParameters parameters) [0x00164] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.BaseAssemblyResolver.Resolve (Mono.Cecil.AssemblyNameReference name) [0x00008] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.DefaultAssemblyResolver.Resolve (Mono.Cecil.AssemblyNameReference name) [0x00023] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.MetadataResolver.Resolve (Mono.Cecil.TypeReference type) [0x0004a] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.ModuleDefinition.Resolve (Mono.Cecil.TypeReference type) [0x00007] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.TypeReference.Resolve () [0x00016] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.Mixin.CheckedResolve (Mono.Cecil.TypeReference self) [0x00001] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.MetadataBuilder.GetConstantType (Mono.Cecil.TypeReference constant_type, System.Object constant) [0x000ba] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.MetadataBuilder.AddConstant (Mono.Cecil.IConstantProvider owner, Mono.Cecil.TypeReference type) [0x00008] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.MetadataBuilder.AddParameter (System.UInt16 sequence, Mono.Cecil.ParameterDefinition parameter, Mono.Cecil.ParamTable table) [0x00065] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.MetadataBuilder.AddParameters (Mono.Cecil.MethodDefinition method) [0x00064] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.MetadataBuilder.AddMethod (Mono.Cecil.MethodDefinition method) [0x0005b] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.MetadataBuilder.AddMethods (Mono.Cecil.TypeDefinition type) [0x00014] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.MetadataBuilder.AddType (Mono.Cecil.TypeDefinition type) [0x000b5] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.MetadataBuilder.AddTypes () [0x00019] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.MetadataBuilder.BuildTypes () [0x0001c] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.MetadataBuilder.BuildModule () [0x000cb] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.MetadataBuilder.BuildMetadata () [0x00001] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.ModuleWriter+<>c.<BuildMetadata>b__2_0 (Mono.Cecil.MetadataBuilder builder, Mono.Cecil.MetadataReader _) [0x00001] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.ModuleDefinition.Read[TItem,TRet] (TItem item, System.Func`3[T1,T2,TResult] read) [0x0002c] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.ModuleWriter.BuildMetadata (Mono.Cecil.ModuleDefinition module, Mono.Cecil.MetadataBuilder metadata) [0x00018] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.ModuleWriter.Write (Mono.Cecil.ModuleDefinition module, Mono.Disposable`1[T] stream, Mono.Cecil.WriterParameters parameters) [0x00161] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.ModuleWriter.WriteModule (Mono.Cecil.ModuleDefinition module, Mono.Disposable`1[T] stream, Mono.Cecil.WriterParameters parameters) [0x00003] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.ModuleDefinition.Write (System.IO.Stream stream, Mono.Cecil.WriterParameters parameters) [0x0001d] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.ModuleDefinition.Write (Mono.Cecil.WriterParameters parameters) [0x00014] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at Mono.Cecil.AssemblyDefinition.Write (Mono.Cecil.WriterParameters parameters) [0x00001] in <13f6124ca6bf4dd4a5ac425c530cf8a5>:0 
  at GameProfile.ProfileMain+<>c__DisplayClass4_0.<Inject>b__0 (Mono.Cecil.AssemblyDefinition assembly) [0x0005d] in D:\Developer\UnityProject\RIMANewUnity\Unity\Assets\Profile\Core\ProfileMain.cs:59 
  at System.Collections.Generic.List`1[T].ForEach (System.Action`1[T] action) [0x0001e] in <a3b02d6f9b494355b946095ea1f25c54>:0 
  at GameProfile.ProfileMain.Inject () [0x0001a] in D:\Developer\UnityProject\RIMANewUnity\Unity\Assets\Profile\Core\ProfileMain.cs:53 
  at GameProfile.ProfileEditor.OnCompilationFinished (System.Object assembly) [0x00017] in D:\Developer\UnityProject\RIMANewUnity\Unity\Assets\Profile\ProfileEditor.cs:55 
UnityEngine.Debug:LogError (object)

Zsnbda avatar Apr 01 '24 02:04 Zsnbda