-
Notifications
You must be signed in to change notification settings - Fork 125
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
CorLibType not perserved after TokenAllocator #252
Comments
JPaja
changed the title
Reflection imprted TypeReference not perserved after TokenAllocator
CorLibTypes not perserved after TokenAllocator
Feb 17, 2022
JPaja
changed the title
CorLibTypes not perserved after TokenAllocator
Type Void not perserved after TokenAllocator
Feb 17, 2022
JPaja
changed the title
Type Void not perserved after TokenAllocator
CorLibType not perserved after TokenAllocator
Feb 17, 2022
Update: Seems like this is issue persists on any type, not just CorLibTypes. Example: using AsmResolver.DotNet;
using AsmResolver.DotNet.Builder;
var module = ModuleDefinition.FromModule(typeof(Program).Module);
var asmResRef = module.AssemblyReferences.First(a => a.Name == "AsmResolver.DotNet");
Type oldRef1 = typeof(MethodDefinition);
Type oldRef2 = typeof(ModuleDefinition);
var reference = new TypeReference(module, asmResRef, "AsmResolver.DotNet", "MethodDefinition");
var reference2 = new TypeReference(module, asmResRef, "AsmResolver.DotNet", "ModuleDefinition");
module.TokenAllocator.AssignNextAvailableToken(reference);
module.TokenAllocator.AssignNextAvailableToken(reference2);
var image = module.ToPEImage(new ManagedPEImageBuilder(MetadataBuilderFlags.PreserveAll));
var newModule = ModuleDefinition.FromImage(image);
var newReference = (TypeReference) newModule.LookupMember(reference.MetadataToken);
var newReference2 = (TypeReference) newModule.LookupMember(reference2.MetadataToken);
Assert.Equal(reference.Namespace, newReference.Namespace);
Assert.Equal(reference.Name, newReference.Name);
Assert.Equal(reference2.Namespace, newReference2.Namespace);
Assert.Equal(reference2.Name, newReference2.Name); using AsmResolver.DotNet;
using AsmResolver.DotNet.Builder;
var module = ModuleDefinition.FromModule(typeof(Program).Module);
var asmResRef = module.AssemblyReferences.First(a => a.Name == "AsmResolver.DotNet");
MethodDefinition oldRef1;
MethodDefinition oldRef2;
var reference = new TypeReference(module, asmResRef, "AsmResolver.DotNet", "MethodDefinition");
var reference2 = new TypeReference(module, asmResRef, "AsmResolver.DotNet", "ModuleDefinition");
module.TokenAllocator.AssignNextAvailableToken(reference);
module.TokenAllocator.AssignNextAvailableToken(reference2);
var image = module.ToPEImage(new ManagedPEImageBuilder(MetadataBuilderFlags.PreserveAll));
var newModule = ModuleDefinition.FromImage(image);
var newReference = (TypeReference) newModule.LookupMember(reference.MetadataToken);
var newReference2 = (TypeReference) newModule.LookupMember(reference2.MetadataToken); My initial guess is that adding same type reference with different token to metadata table gets ignored. Possible solutions:
|
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Describe the bug
TypeReferences that are constructed by importing reflection type, are not preserved after using TokenAllocator on them.
Issue is same for allocating tokens on references generated by CorLibFactory where assembly contains typeof() of that type
To Reproduce
Expected behavior
newModule.LookupMember should not throw, and should return perserved TypeReference
Platform
The text was updated successfully, but these errors were encountered: