使用pythonnet调用C# DLL时遇System.IO.Directory类型加载失败求助
解决方案:System.TypeLoadException 无法加载 System.IO.Directory
错误原因
该错误源于Pythonnet默认加载的运行时与你的.NET 7编译库不匹配,或缺少程序集绑定重定向规则,导致无法找到对应版本的System.Runtime程序集。
具体解决步骤
1. 指定Pythonnet使用.NET Core运行时
Pythonnet 3.x支持.NET Core/.NET 5+,但默认会尝试加载.NET Framework。需在导入clr前设置环境变量指定运行时:
import os # 指定使用.NET Core运行时 os.environ['PYTHONNET_RUNTIME'] = 'coreclr' # 可选:若系统未配置DOTNET环境变量,手动指定.NET 7安装路径 os.environ['DOTNET_ROOT'] = r'C:\Program Files\dotnet' # 按实际路径调整 import clr dll_directory = "./" clr.AddReference(os.path.join(dll_directory, "LicenseService_Dll.dll")) clr.AddReference(os.path.join(dll_directory, "FLEXlm_C_sharp.dll")) from Verifai.Infra.Service.Repository import FlexlmLicenseService license_service = FlexlmLicenseService() directory_path = r"D:\LicenseService\pythonDll" status = license_service.CheckOutUsingLicenseSettings(directory_path)
2. 调整C#项目的csproj配置
在项目配置中添加绑定重定向自动生成规则,确保编译时生成正确的版本映射文件:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net7.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <!-- 添加绑定重定向配置 --> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup> <ItemGroup> <Reference Include="FLEXlm_C_sharp"> <HintPath>FLEXlm_C_sharp.dll</HintPath> </Reference> </ItemGroup> <Target Name="CopyLicDllAfterBuild" AfterTargets="Build"> <Exec Command="xcopy "$(ProjectDir)\lmgr11_64.dll" "$(TargetDir)" /Y /I" /> </Target> <Target Name="CopyLicDllAfterPublish" AfterTargets="Publish"> <Exec Command="xcopy "$(ProjectDir)\lmgr11_64.dll" "$(PublishDir)" /Y /I" /> </Target> </Project>
重新编译后,将生成的LicenseService_Dll.dll.config文件与DLL一同放到Python运行目录。
3. 手动添加程序集绑定重定向
若自动生成的配置无效,手动创建LicenseService_Dll.dll.config文件,强制版本映射:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
将该文件放置在LicenseService_Dll.dll的同级目录下。
4. 兼容.NET Framework依赖
如果FLEXlm_C_sharp.dll是基于.NET Framework编译的,可将你的C#项目改为多目标编译,生成兼容.NET Framework的版本:
修改csproj的目标框架配置:
<TargetFrameworks>net7.0;net472</TargetFrameworks>
编译后选择net472目录下的DLL进行Python调用,此时无需设置PYTHONNET_RUNTIME环境变量。
内容的提问来源于stack exchange,提问作者Rodo
相关产品推荐
相关产品推荐

