将新创建的类型导入另一个程序集失败

时间:2013-12-04 21:57:00

标签: c# mono.cecil

当我尝试将新创建的类型导入另一个程序集时,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?

更新: 我发现,有某种程序集缓存。可以/我应该尝试使它无效吗?

1 个答案:

答案 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的这个重载,因为它是唯一使用缓存的,因此不会再次加载程序集。我想这不是故意的。

感谢上帝,它是开源的。