Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将新创建的类型导入另一个程序集失败_C#_Mono.cecil - Fatal编程技术网

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

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

当我尝试将新创建的类型导入到另一个程序集中时,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?
更新:
我发现有某种程序集缓存。我可以/应该尝试使其无效吗?

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

感谢上帝,这是开源的