使用Mono.Cecil注入程序集引用后找不到依赖程序集如何解决
问题核心原因
你仅通过ImportReference导入了Tracer类的方法引用,但Mono.Cecil不会自动将该类型所属的程序集添加到目标程序集的引用列表中,这是最常见的遗漏操作。同时报错信息中提示的程序集名称instrospect.types和你提到的实际文件名introspect.types.dll存在拼写差异,也可能是加载失败的原因。
修复步骤
1. 手动添加程序集引用到目标模块
在保存修改后的程序集之前,将Tracer所属的程序集显式添加到目标模块的引用列表中,参考代码:
// 先获取Tracer所属程序集的信息 var tracerAssemblyName = typeof(Tracer).Assembly.GetName(); // 创建Mono.Cecil的程序集引用对象 var tracerAssemblyRef = new AssemblyNameReference(tracerAssemblyName.Name, tracerAssemblyName.Version) { Culture = string.IsNullOrEmpty(tracerAssemblyName.CultureInfo.Name) ? "neutral" : tracerAssemblyName.CultureInfo.Name, PublicKeyToken = tracerAssemblyName.GetPublicKeyToken() }; // 去重后添加到目标模块的引用列表 if (!module.AssemblyReferences.Any(r => r.Name == tracerAssemblyRef.Name)) { module.AssemblyReferences.Add(tracerAssemblyRef); }
这段代码需要放在module.Write之前执行即可。
2. 修正程序集名称拼写
报错中要求加载的程序集名称是instrospect.types,你放置的文件名为introspect.types.dll,多了一个字母t,请确认:
- 是你拼写错误放错了文件,还是创建引用时写错了程序集名称,保证引用名称和实际文件名完全一致。
3. 其他兼容性检查
- 确认
introspect.types.dll的版本和报错中要求的1.0.0.0完全匹配,若版本不一致可以添加绑定重定向,或者直接使用版本匹配的dll - 确认
introspect.types.dll的目标框架和你修改后的程序集目标框架兼容,例如.NET 6的程序集无法直接引用.NET Framework编译的程序集 - 若
introspect.types.dll是强签名程序集,需保证引用中的PublicKeyToken和实际dll的签名公钥完全一致。
内容的提问来源于stack exchange,提问作者nein.
相关产品推荐
相关产品推荐

