C# 将新创建的类型导入另一个程序集失败
当我尝试将新创建的类型导入到另一个程序集中时,Mono.Cecil无法解析它。为什么会这样?我能做些什么C# 将新创建的类型导入另一个程序集失败,c#,mono.cecil,C#,Mono.cecil,当我尝试将新创建的类型导入到另一个程序集中时,Mono.Cecil无法解析它。为什么会这样?我能做些什么 var resolver = new DefaultAssemblyResolver(); resolver.AddSearchDirectory(...); var readerParameters = new ReaderParameters { AssemblyResolver = resolver }; var asm1 = AssemblyDefinition.ReadAssemb
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?
更新:
我发现有某种程序集缓存。我可以/应该尝试使其无效吗?我发现
AssemblyDefinition.ReadAssembly
不使用DefaultAssemblyResolver
的缓存,因此在typeRef.Resolve()
再次解析程序集,当然找不到新添加的类型。
这就是为什么我换了工作
var resolver = new DefaultAssemblyResolver();
resolver.AddSearchDirectory(...);
var asm1 = resolver.Resolve(AssemblyNameReference.Parse(...));
var asm2 = resolver.Resolve(AssemblyNameReference.Parse(...));
...
您必须使用此重载Resolve
,因为它是唯一使用缓存的重载,因此不会再次加载程序集。我想这不是故意的
谢天谢地,它是开源的。我发现
AssemblyDefinition.ReadAssembly
没有使用DefaultAssemblyResolver
的缓存,所以在typeRef.Resolve()
再次解析程序集,当然找不到新添加的类型。
这就是为什么我换了工作
var resolver = new DefaultAssemblyResolver();
resolver.AddSearchDirectory(...);
var asm1 = resolver.Resolve(AssemblyNameReference.Parse(...));
var asm2 = resolver.Resolve(AssemblyNameReference.Parse(...));
...
您必须使用此重载Resolve
,因为它是唯一使用缓存的重载,因此不会再次加载程序集。我想这不是故意的
感谢上帝,这是开源的