当我尝试将新创建的类型导入另一个程序集时,Mono.Cecil无法解析它。为什么这样,我该怎么办?
var resolver = new DefaultAssemblyResolver();
resolver.AddSearchDirectory(...);
var readerParameters = new ReaderParameters { AssemblyResolver = resolver };
var asm1 = AssemblyDefinition.ReadAssembly("path/to/assembly1.dll", readerParameters);
var asm2 = AssemblyDefinition.ReadAssembly("path/to/assembly2.dll", readerParameters);
// add type to one assembly
var type = new TypeDefinition("Test", "TestType", TypeAttributes.Public);
asm2.MainModule.Types.Add(type);
// import type into another assembly
var typeRef = asm1.MainModule.Import(type);
var typeDef = typeRef.Resolve(); // why does this return null?
更新: 我发现,有某种程序集缓存。可以/我应该尝试使它无效吗?
答案 0 :(得分:1)
我发现AssemblyDefinition.ReadAssembly
不使用DefaultAssemblyResolver
的缓存,因此在typeRef.Resolve()
处再次解析程序集,当然无法找到新添加的类型。
这就是我切换到
var resolver = new DefaultAssemblyResolver();
resolver.AddSearchDirectory(...);
var asm1 = resolver.Resolve(AssemblyNameReference.Parse(...));
var asm2 = resolver.Resolve(AssemblyNameReference.Parse(...));
...
你必须使用Resolve
的这个重载,因为它是唯一使用缓存的,因此不会再次加载程序集。我想这不是故意的。
感谢上帝,它是开源的。