Fix: ImportReference(field, context) not importing field type when needed #973

Open
ColinTimBarndt wants to merge 1 commit from ColinTimBarndt/fix/import-reference into master
ColinTimBarndt commented 2025-09-22 09:10:06 -05:00 (Migrated from github.com)

When importing a field reference where the field declaring type is on module A, but its type is on module B, then writing the assembly A fails because the field reference type is not imported due to a short-circuit clause.

This patch solves https://github.com/Yellow-Dog-Man/Resonite-Issues/issues/5656.

Stack trace from that issue
System.ArgumentException: Member 'FrooxEngine.FieldDrive`1' (Mono.Cecil.TypeDefinition) is declared in another module 'FrooxEngine.dll' and needs to be imported (expected Plugin.Wasm.dll)
   at Mono.Cecil.MetadataBuilder.LookupToken(IMetadataTokenProvider provider) in [...]/Mono.Cecil/AssemblyWriter.cs:line 2283
   at Mono.Cecil.SignatureWriter.MakeTypeDefOrRefCodedRID(TypeReference type) in [...]/Mono.Cecil/AssemblyWriter.cs:line 2761
   at Mono.Cecil.SignatureWriter.WriteTypeSignature(TypeReference type) in [...]/Mono.Cecil/AssemblyWriter.cs:line 2794
   at Mono.Cecil.MetadataBuilder.GetFieldSignature(FieldReference field) in [...]/Mono.Cecil/AssemblyWriter.cs:line 2143
   at Mono.Cecil.MetadataBuilder.GetMemberRefSignature(MemberReference member) in [...]/Mono.Cecil/AssemblyWriter.cs:line 2158
   at Mono.Cecil.MetadataBuilder.CreateMemberRefRow(MemberReference member) in [...]/Mono.Cecil/AssemblyWriter.cs:line 2040
   at Mono.Cecil.MetadataBuilder.GetMemberRefToken(MemberReference member) in [...]/Mono.Cecil/AssemblyWriter.cs:line 2029
   at Mono.Cecil.MetadataBuilder.LookupToken(IMetadataTokenProvider provider) in [...]/Mono.Cecil/AssemblyWriter.cs:line 2301
   at Mono.Cecil.Cil.CodeWriter.WriteOperand(Instruction instruction) in [...]/Mono.Cecil.Cil/CodeWriter.cs:line 270
   at Mono.Cecil.Cil.CodeWriter.WriteInstructions() in [...]/Mono.Cecil.Cil/CodeWriter.cs:line 180
   at Mono.Cecil.Cil.CodeWriter.WriteResolvedMethodBody(MethodDefinition method) in [...]/Mono.Cecil.Cil/CodeWriter.cs:line 111
   at Mono.Cecil.Cil.CodeWriter.WriteMethodBody(MethodDefinition method) in [...]/Mono.Cecil.Cil/CodeWriter.cs:line 54
   at Mono.Cecil.MetadataBuilder.AddMethod(MethodDefinition method) in [...]/Mono.Cecil/AssemblyWriter.cs:line 1683
   at Mono.Cecil.MetadataBuilder.AddMethods(TypeDefinition type) in [...]/Mono.Cecil/AssemblyWriter.cs:line 1676
   at Mono.Cecil.MetadataBuilder.AddType(TypeDefinition type) in [...]/Mono.Cecil/AssemblyWriter.cs:line 1473
   at Mono.Cecil.MetadataBuilder.AddTypes() in [...]/Mono.Cecil/AssemblyWriter.cs:line 1445
   at Mono.Cecil.MetadataBuilder.BuildTypes() in [...]/Mono.Cecil/AssemblyWriter.cs:line 1294
   at Mono.Cecil.MetadataBuilder.BuildModule() in [...]/Mono.Cecil/AssemblyWriter.cs:line 1064
   at Mono.Cecil.MetadataBuilder.BuildMetadata() in [...]/Mono.Cecil/AssemblyWriter.cs:line 1034
   at Mono.Cecil.ModuleWriter.<>c.<BuildMetadata>b__2_0(MetadataBuilder builder, MetadataReader _) in [...]/Mono.Cecil/AssemblyWriter.cs:line 147
   at Mono.Cecil.ModuleDefinition.Read[TItem,TRet](TItem item, Func`3 read) in [...]/Mono.Cecil/ModuleDefinition.cs:line 982
   at Mono.Cecil.ModuleWriter.BuildMetadata(ModuleDefinition module, MetadataBuilder metadata) in [...]/Mono.Cecil/AssemblyWriter.cs:line 146
   at Mono.Cecil.ModuleWriter.Write(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters) in [...]/Mono.Cecil/AssemblyWriter.cs:line 119
   at Mono.Cecil.ModuleWriter.WriteModule(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters) in [...]/Mono.Cecil/AssemblyWriter.cs:line 78
   at Mono.Cecil.ModuleDefinition.Write(Stream stream, WriterParameters parameters) in [...]/Mono.Cecil/ModuleDefinition.cs:line 1198
   at Mono.Cecil.ModuleDefinition.Write(WriterParameters parameters) in [...]/Mono.Cecil/ModuleDefinition.cs:line 1184
   at Mono.Cecil.AssemblyDefinition.Write(WriterParameters parameters) in [...]/Mono.Cecil/AssemblyDefinition.cs:line 171
   at FrooxEngine.Weaver.AssemblyPostProcessor.Process(String path, String& versionNumber, String frooxEngineModuleRoot) in D:\Workspace\Everion\FrooxEngine\FrooxEngine.Weaver\AssemblyPostProcessor.cs:line 502
   at FrooxEngine.Weaver.AssemblyPostProcessor.Process(String path, String frooxEngineModuleRoot) in D:\Workspace\Everion\FrooxEngine\FrooxEngine.Weaver\AssemblyPostProcessor.cs:line 46
   at FrooxEngine.Engine.ProcessStartupCommands(LaunchOptions options)
   at FrooxEngine.Engine.Initialize(String appPath, Boolean useRenderer, LaunchOptions options, ISystemInfo systemInfo, IEngineInitProgress progress)
   at Renderite.Host.GraphicalClientRunner.Run(LaunchOptions options) in D:\Workspace\Everion\FrooxEngine\GraphicalClient\GraphicalClientRunner.cs:line 115
   at Program.<Main>$(String[] args) in D:\Workspace\Everion\FrooxEngine\GraphicalClient\Program.cs:line 51
When importing a field reference where the field declaring type is on module A, but its type is on module B, then writing the assembly A fails because the field reference type is not imported due to a short-circuit clause. This patch solves https://github.com/Yellow-Dog-Man/Resonite-Issues/issues/5656. <details><summary>Stack trace from that issue</summary> ```txt System.ArgumentException: Member 'FrooxEngine.FieldDrive`1' (Mono.Cecil.TypeDefinition) is declared in another module 'FrooxEngine.dll' and needs to be imported (expected Plugin.Wasm.dll) at Mono.Cecil.MetadataBuilder.LookupToken(IMetadataTokenProvider provider) in [...]/Mono.Cecil/AssemblyWriter.cs:line 2283 at Mono.Cecil.SignatureWriter.MakeTypeDefOrRefCodedRID(TypeReference type) in [...]/Mono.Cecil/AssemblyWriter.cs:line 2761 at Mono.Cecil.SignatureWriter.WriteTypeSignature(TypeReference type) in [...]/Mono.Cecil/AssemblyWriter.cs:line 2794 at Mono.Cecil.MetadataBuilder.GetFieldSignature(FieldReference field) in [...]/Mono.Cecil/AssemblyWriter.cs:line 2143 at Mono.Cecil.MetadataBuilder.GetMemberRefSignature(MemberReference member) in [...]/Mono.Cecil/AssemblyWriter.cs:line 2158 at Mono.Cecil.MetadataBuilder.CreateMemberRefRow(MemberReference member) in [...]/Mono.Cecil/AssemblyWriter.cs:line 2040 at Mono.Cecil.MetadataBuilder.GetMemberRefToken(MemberReference member) in [...]/Mono.Cecil/AssemblyWriter.cs:line 2029 at Mono.Cecil.MetadataBuilder.LookupToken(IMetadataTokenProvider provider) in [...]/Mono.Cecil/AssemblyWriter.cs:line 2301 at Mono.Cecil.Cil.CodeWriter.WriteOperand(Instruction instruction) in [...]/Mono.Cecil.Cil/CodeWriter.cs:line 270 at Mono.Cecil.Cil.CodeWriter.WriteInstructions() in [...]/Mono.Cecil.Cil/CodeWriter.cs:line 180 at Mono.Cecil.Cil.CodeWriter.WriteResolvedMethodBody(MethodDefinition method) in [...]/Mono.Cecil.Cil/CodeWriter.cs:line 111 at Mono.Cecil.Cil.CodeWriter.WriteMethodBody(MethodDefinition method) in [...]/Mono.Cecil.Cil/CodeWriter.cs:line 54 at Mono.Cecil.MetadataBuilder.AddMethod(MethodDefinition method) in [...]/Mono.Cecil/AssemblyWriter.cs:line 1683 at Mono.Cecil.MetadataBuilder.AddMethods(TypeDefinition type) in [...]/Mono.Cecil/AssemblyWriter.cs:line 1676 at Mono.Cecil.MetadataBuilder.AddType(TypeDefinition type) in [...]/Mono.Cecil/AssemblyWriter.cs:line 1473 at Mono.Cecil.MetadataBuilder.AddTypes() in [...]/Mono.Cecil/AssemblyWriter.cs:line 1445 at Mono.Cecil.MetadataBuilder.BuildTypes() in [...]/Mono.Cecil/AssemblyWriter.cs:line 1294 at Mono.Cecil.MetadataBuilder.BuildModule() in [...]/Mono.Cecil/AssemblyWriter.cs:line 1064 at Mono.Cecil.MetadataBuilder.BuildMetadata() in [...]/Mono.Cecil/AssemblyWriter.cs:line 1034 at Mono.Cecil.ModuleWriter.<>c.<BuildMetadata>b__2_0(MetadataBuilder builder, MetadataReader _) in [...]/Mono.Cecil/AssemblyWriter.cs:line 147 at Mono.Cecil.ModuleDefinition.Read[TItem,TRet](TItem item, Func`3 read) in [...]/Mono.Cecil/ModuleDefinition.cs:line 982 at Mono.Cecil.ModuleWriter.BuildMetadata(ModuleDefinition module, MetadataBuilder metadata) in [...]/Mono.Cecil/AssemblyWriter.cs:line 146 at Mono.Cecil.ModuleWriter.Write(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters) in [...]/Mono.Cecil/AssemblyWriter.cs:line 119 at Mono.Cecil.ModuleWriter.WriteModule(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters) in [...]/Mono.Cecil/AssemblyWriter.cs:line 78 at Mono.Cecil.ModuleDefinition.Write(Stream stream, WriterParameters parameters) in [...]/Mono.Cecil/ModuleDefinition.cs:line 1198 at Mono.Cecil.ModuleDefinition.Write(WriterParameters parameters) in [...]/Mono.Cecil/ModuleDefinition.cs:line 1184 at Mono.Cecil.AssemblyDefinition.Write(WriterParameters parameters) in [...]/Mono.Cecil/AssemblyDefinition.cs:line 171 at FrooxEngine.Weaver.AssemblyPostProcessor.Process(String path, String& versionNumber, String frooxEngineModuleRoot) in D:\Workspace\Everion\FrooxEngine\FrooxEngine.Weaver\AssemblyPostProcessor.cs:line 502 at FrooxEngine.Weaver.AssemblyPostProcessor.Process(String path, String frooxEngineModuleRoot) in D:\Workspace\Everion\FrooxEngine\FrooxEngine.Weaver\AssemblyPostProcessor.cs:line 46 at FrooxEngine.Engine.ProcessStartupCommands(LaunchOptions options) at FrooxEngine.Engine.Initialize(String appPath, Boolean useRenderer, LaunchOptions options, ISystemInfo systemInfo, IEngineInitProgress progress) at Renderite.Host.GraphicalClientRunner.Run(LaunchOptions options) in D:\Workspace\Everion\FrooxEngine\GraphicalClient\GraphicalClientRunner.cs:line 115 at Program.<Main>$(String[] args) in D:\Workspace\Everion\FrooxEngine\GraphicalClient\Program.cs:line 51 ``` </details>
This pull request is broken due to missing fork information.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin 'ColinTimBarndt/fix/import-reference:ColinTimBarndt/fix/import-reference'
git switch 'ColinTimBarndt/fix/import-reference'

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch 'master'
git merge --no-ff 'ColinTimBarndt/fix/import-reference'
git switch 'ColinTimBarndt/fix/import-reference'
git rebase 'master'
git switch 'master'
git merge --ff-only 'ColinTimBarndt/fix/import-reference'
git switch 'ColinTimBarndt/fix/import-reference'
git rebase 'master'
git switch 'master'
git merge --no-ff 'ColinTimBarndt/fix/import-reference'
git switch 'master'
git merge --squash 'ColinTimBarndt/fix/import-reference'
git switch 'master'
git merge --ff-only 'ColinTimBarndt/fix/import-reference'
git switch 'master'
git merge 'ColinTimBarndt/fix/import-reference'
git push origin 'master'
Sign in to join this conversation.
No reviewers
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
gh-jbevain/cecil!973
No description provided.