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

使用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 &quot;$(ProjectDir)\lmgr11_64.dll&quot; &quot;$(TargetDir)&quot; /Y /I" />
  </Target>
  <Target Name="CopyLicDllAfterPublish" AfterTargets="Publish">
    <Exec Command="xcopy &quot;$(ProjectDir)\lmgr11_64.dll&quot; &quot;$(PublishDir)&quot; /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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 07:24:53