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

ActiveX EXE调用Assembly.LoadFile加载DLL报ReflectionTypeLoadException如何解决

问题根因

程序作为普通EXE独立运行时,进程工作目录默认是EXE本身的存放目录,.NET运行时的程序集搜索逻辑会自动扫描该目录加载依赖,因此功能正常。当它被注册为ActiveX对象被外部程序调用时,进程的工作目录为调用方程序的启动目录,不是你的ActiveX EXE、DLL的存放目录,同时Assembly.LoadFile方法不会将被加载DLL的所在目录加入依赖搜索路径,最终导致运行时找不到同目录下的PSInterface.dll。

解决方案

按落地优先级排列可选择以下方案:

  • 方案1:替换Assembly.LoadFile为Assembly.LoadFrom
    LoadFrom方法会自动将被加载程序集的所在目录加入依赖搜索路径,加载时会自动扫描该目录查找依赖的PSInterface.dll,修改代码如下:
Dim a As System.Reflection.Assembly = System.Reflection.Assembly.LoadFrom(FullPath)
  • 方案2:加载目标DLL前手动切换工作目录
    在调用加载逻辑前,先将当前进程工作目录设置为ActiveX EXE自身的存放路径:
' 获取当前ActiveX EXE所在目录
Dim exeDir As String = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)
' 切换当前工作目录到EXE目录
System.IO.Directory.SetCurrentDirectory(exeDir)
' 再加载目标DLL
Dim a As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile(FullPath)
  • 方案3:添加应用程序配置文件指定搜索路径
    在ActiveX EXE同目录下新建和EXE同名的.config文件,例如EXE名为MyActiveX.exe则新建MyActiveX.exe.config,内容如下:
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="."/>
    </assemblyBinding>
  </runtime>
</configuration>

该配置会让.NET运行时始终将EXE所在目录纳入程序集搜索路径。

  • 方案4:将PSInterface.dll注册到全局程序集缓存(GAC)
    如果以上方案都不适用,可以给PSInterface.dll添加强签名,之后执行gacutil /i PSInterface.dll命令将其注册到GAC,无论进程工作目录是什么,.NET运行时都可以正常找到该程序集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:09:02