cecil
cecil copied to clipboard
Unable to round-trip with unresolved enum constants
It looks like this was discussed in https://github.com/jbevain/cecil/issues/236, and implemented for attributes, but not fields or default parameters.
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.
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.
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.
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.
hi,sbomer. I encountered this problem. What should I do to resolve it?
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?
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)