IronPython调用C#引用时抛出同类型参数的ArgumentTypeException异常
问题排查思路
- 优先排查程序集重复加载问题:确认代码中是否存在其他位置通过
clr.AddReference、clr.AddReferenceToFile等API再次加载了XXXX.dll,即使路径写法不同但指向同一文件,多次加载也会生成不同的程序集实例,其中定义的类型会被CLR判定为完全不同的类型,哪怕命名空间、类名完全一致。 - 校验程序集加载来源:新增日志分别打印参数类型所属的程序集路径,以及方法定义所属的程序集路径,对比二者是否完全一致:
# 输出传入参数的类型对应程序集路径 print(ParameterValue.GetType().Assembly.Location) # 输出方法所在类对应程序集路径,示例中方法属于ExampleClass,可自行替换为实际类名 print(type(ExampleClass.Method).DeclaringType.Assembly.Location)
若二者输出路径不同,即可确认是重复加载不同程序集导致的类型不匹配。
- 检查是否存在多版本同名程序集:确认运行环境中是否有其他目录存放了不同版本的
XXXX.dll,且IronPython的程序集加载优先级更高的目录中也存在该文件,导致实际加载的文件和你预期路径的文件不是同一个。 - 排查命名空间/类型导入冲突:确认导入类型时是否存在冲突,比如同时执行了
from Namespace1 import ParameterValue和from Namespace2 import ParameterValue,导致实际实例化的类型和方法要求的参数类型来自不同命名空间。 - 校验isinstance判断逻辑:确认调用
isinstance时传入的第二个参数是方法要求的参数类型,而非你实例化时用到的类型,如果二者来自不同程序集,isinstance会返回False,若你之前的校验返回了True,大概率是你使用了错误的类型对象做对比。
内容的提问来源于stack exchange,提问作者Furk4n
相关产品推荐
相关产品推荐

