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

Visual Basic类库引用固定目录DLL失败:FileNotFoundException

解决.NET Framework 4.6.2类库引用固定目录外部32位DLL的问题

针对你遇到的编译成功但运行时找不到DLL的问题,以下是几种无需复制DLL、不修改原目录的可行方案:

方法1:修复配置(确保版本和令牌正确)

之前不生效大概率是因为没指定完整的程序集标识信息。

  • 先获取DLL的关键信息:
    1. 打开VS开发者命令提示符,执行sn -T "C:\Applications\xxx\bi\ExampleDLL.dll",得到公钥令牌(如果DLL未强签名,令牌为null)。
    2. 右键DLL→属性→详细信息,查看产品版本或文件版本(要和程序集版本完全一致)。
  • 完整的app.config配置示例:
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="ExampleDLL" 
                          publicKeyToken="替换为你的公钥令牌,无则写null"
                          culture="neutral"
                          version="替换为DLL的版本号"/>
        <codeBase version="替换为DLL的版本号" href="file:///C:/Applications/xxx/bi/ExampleDLL.dll"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
  • 注意:版本号必须完全匹配,哪怕是小版本号也不能错,否则CLR会忽略这个配置。

方法2:动态绑定程序集加载事件

通过CLR的AssemblyResolve事件,在找不到DLL时主动加载指定路径的文件:

  • 在你的类库中添加如下代码(比如放在类的静态构造函数里):
Imports System.Reflection

Public Class YourMainLibraryClass
    ' 静态构造函数,程序启动时执行
    Shared Sub New()
        AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf LoadExternalDLL
    End Sub

    Private Shared Function LoadExternalDLL(sender As Object, args As ResolveEventArgs) As Assembly
        Dim targetAssembly As New AssemblyName(args.Name)
        ' 匹配目标DLL名称
        If targetAssembly.Name.Equals("ExampleDLL", StringComparison.OrdinalIgnoreCase) Then
            Dim dllFullPath As String = "C:\Applications\xxx\bi\ExampleDLL.dll"
            Return Assembly.LoadFrom(dllFullPath)
        End If
        ' 其他DLL按默认逻辑处理
        Return Nothing
    End Function
End Class
  • 这个方法不需要依赖app.config,灵活性更高,适合未强签名或版本经常变动的DLL。

方法3:添加DLL路径到系统PATH环境变量

CLR会自动搜索系统PATH中的目录找依赖DLL:

  • 临时方案:调试前,打开命令提示符执行set PATH=%PATH%;C:\Applications\xxx\bi,然后从该命令提示符启动VS,这样当前会话下VS会识别到新的PATH路径。
  • 永久方案:右键“此电脑”→属性→高级系统设置→环境变量,在系统变量的PATH中添加C:\Applications\xxx\bi,重启VS后生效。

必做的前置检查

  • 确保项目目标平台是x86:右键项目→属性→生成→目标平台选择x86,因为外部DLL是32位,位数不匹配会导致即使找到DLL也加载失败。
  • 保持引用的“复制本地”为False:在引用的属性中确认“复制本地”是False,避免VS尝试将DLL复制到输出目录。
  • 重新查看Fusion Log:配置完方案后,再用Assembly Fusion Log验证CLR是否开始尝试加载指定路径的DLL,定位问题是否解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 06:13:29