Pythonnet调用C# DLL遇初始化/空引用异常及Grpc依赖问题
排查建议
针对TypeInitializationException/NullReferenceException异常
- 排查
GetReleaseNumber方法的依赖逻辑:检查该方法是否读取了注册表、环境变量、相对路径文件等依赖项。Pythonnet/TestStand的运行上下文(工作目录、权限、环境变量)和纯C#程序可能存在差异,比如纯C#运行时工作目录是DLL所在路径,而Python/TestStand可能在其他路径,导致相对路径读取失败;或者需要管理员权限的注册表项在普通用户权限下无法读取,返回null触发空引用。 - 给静态构造函数添加日志:在
ProductPaths静态构造函数的GetReleaseNumber调用前后,写入详细日志到本地文件(比如记录读取的路径、返回值、当前工作目录),通过日志定位具体哪一步抛出了异常(TypeInitializationException通常是内部静态构造执行失败的包装,需要看内部异常细节)。 - 统一运行上下文:在Python代码或TestStand配置中,强制设置工作目录为C# DLL所在的绝对路径;或者修改
GetReleaseNumber方法,所有文件/注册表操作使用绝对路径。 - 验证权限差异:对比纯C#程序和Python/TestStand的运行权限,若
GetReleaseNumber涉及高权限操作,尝试以管理员身份启动Python或TestStand测试。
针对Grpc.Core版本不匹配异常
- 确认依赖来源:使用dnSpy、ILDasm等工具检查C# DLL的直接/间接依赖,确认是自身引用了Grpc.Core 2.0.0.0,还是依赖的第三方库引用了旧版本。
- 添加绑定重定向配置:在Python脚本的运行目录下创建
app.config文件,添加绑定重定向规则,将旧版本的Grpc.Core定向到你已有的2.42.0或2.46.6版本。配置示例:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Grpc.Core" publicKeyToken="d754f35622e28bad" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.46.6.0" newVersion="2.46.6.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
- 确保依赖DLL可被加载:将你拥有的Grpc.Core.dll(2.42.0或2.46.6版本)复制到以下路径之一:C# DLL所在目录、Python的
site-packages目录、TestStand的执行引擎目录,确保运行时能找到对应版本的库。 - 检查Pythonnet加载方式:使用
clr.LoadAssemblyFromFile指定C# DLL的绝对路径进行加载,避免依赖自动查找路径导致的版本不匹配问题。
内容的提问来源于stack exchange,提问作者VCU
相关产品推荐
相关产品推荐

