jbevain / cecil

Cecil is a library to inspect, modify and create .NET programs and libraries.
MIT License
2.72k stars 620 forks source link

Unable to round-trip with unresolved enum constants #673

Open sbomer opened 4 years ago

sbomer commented 4 years ago

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.

jbevain commented 4 years ago

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.

sbomer commented 4 years ago

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 commented 4 years ago

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.

Pcookie commented 1 year ago

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

Pcookie commented 1 year ago

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?

Zsnbda commented 5 months ago

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)