You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已加载程序集存在对应构造方法仍抛出System.MissingMethodException问题求助

问题原因分析

你遇到的是典型的CLR类型身份不匹配导致的MissingMethodException,虽然构造函数的字面签名完全一致,但CLR判断方法签名时会校验参数类型的完整身份,以及程序集的加载上下文,常见原因如下:

  • 参数类型的程序集版本不匹配

构造函数参数中的Google.OrTools.ConstraintSolver.Solver类型的身份不一致:动态编译生成的dll编译时引用的Google.OrTools程序集,和运行时实际加载的Google.OrTools程序集的版本号、公钥令牌不相同,CLR会将其判定为完全不同的两个类型,导致构造函数签名匹配失败。

  • 程序集加载上下文隔离

你显式加载动态编译dll时如果使用了Assembly.LoadFile、Assembly.LoadFrom等方法,会将程序集加载到和默认上下文隔离的加载上下文中。哪怕是同路径的同一个ConstraintSolverExpressions.dll,在不同加载上下文中加载后产生的程序集实例、内部定义的类型都是互不兼容的。你在默认上下文中通过反射查到了符合要求的构造函数,但动态编译代码在自身的加载上下文中找不到匹配的类型和方法。

  • 编译时与运行时的程序集元数据不一致

虽然你指定编译时引用的ConstraintSolverExpressions.dll和运行时加载的是同路径文件,但如果在动态dll编译完成后、执行前,ConstraintSolverExpressions.dll被重新编译覆盖过,编译时记录的元数据Token和运行时的元数据不匹配,也会触发方法查找失败。

  • 架构或目标框架不兼容

如果ConstraintSolverExpressions.dll、动态编译生成的dll、主程序三者的目标架构(x86/x64/Any CPU)不一致,或者目标.NET框架版本不兼容,也会出现方法找不到的问题。

排查方案
  1. 校验Google.OrTools程序集的一致性:分别导出动态编译dll的引用程序集列表,和运行时AppDomain.CurrentDomain.GetAssemblies()中Google.OrTools的FullName,确认版本号、公钥令牌完全一致。
  2. 校验程序集加载上下文:在动态生成的C#代码中插入反射逻辑,输出它访问的ConstraintSolverExpressions.CSEObjectFactory所在程序集的FullName、Location和实例哈希值,和你之前在异常前输出的对应值对比,确认是同一个程序集实例。
  3. 确认编译后没有修改过引用的ConstraintSolverExpressions.dll,清理临时目录后重新生成动态dll再测试。
  4. 检查三者的目标架构和.NET框架版本,确保完全匹配。

内容的提问来源于stack exchange,提问作者Christopher Hamkins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 01:06:01