VB.NET解决方案中从指定文件夹加载指定版本程序集失败求助
VB.NET 指定文件夹加载DLL异常的解决思路
1. 校验app.config配置的准确性
- 检查程序集名称拼写:你配置里的
Eplan.EplApi.Starteru可能存在拼写错误,EPLAN官方API组件通常命名为Eplan.EplApi.Starter,建议核对目标DLL的实际文件名。 - 匹配公钥令牌与版本:
用命令确认目标DLL的真实公钥令牌:
同时右键DLL→属性→详细信息,确认程序集版本,必须与dotnet sn -Tp "C:\Program Files\EPLAN\Platform\2023.0.3\Bin\Eplan.EplApi.Starteru.dll"codeBase标签里的version完全一致,不能随意填写1.0.0.0。 - 禁用发布策略:将
publisherPolicy apply="yes"改为apply="no",发布策略可能会覆盖你自定义的路径配置。
2. 排查权限问题
目标路径C:\Program Files\EPLAN属于系统保护目录,普通权限的程序可能无法读取该目录下的文件。尝试:
- 右键以管理员身份运行VB.NET程序
- 将目标DLL复制到非系统目录(如
D:\EplanDlls),修改配置路径后测试
3. 修正动态加载逻辑
如果之前的动态加载方案失效,推荐使用AppDomain.AssemblyResolve事件来拦截加载请求,确保程序集被正确定位:
' 在程序启动时注册事件(如Main方法或窗体构造函数) AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf ResolveTargetAssembly Private Function ResolveTargetAssembly(sender As Object, args As ResolveEventArgs) As Assembly ' 提取程序集名称,拼接完整路径 Dim assemblyName As String = args.Name.Split(","c)(0) Dim targetPath As String = $"C:\Program Files\EPLAN\Platform\2023.0.3\Bin\{assemblyName}.dll" If IO.File.Exists(targetPath) Then Return Assembly.LoadFrom(targetPath) End If Return Nothing End Function
注意:若目标DLL依赖其他组件,需确保这些依赖也能被该事件或系统加载机制找到。
4. 获取完整异常信息
原异常无额外提示,可通过捕获完整异常栈定位根因:
Try ' 放置触发DLL加载的初始化代码 Catch ex As Exception ' 输出完整异常详情到弹窗或日志 MessageBox.Show($"异常详情:{ex.ToString()}") End Try
完整的异常信息会明确告知是版本不匹配、依赖缺失还是权限不足等具体问题。
5. 检查DLL依赖完整性
用Dependency Walker或dotnet-depends工具扫描目标DLL,确认是否存在缺失的依赖项,同时核对DLL的.NET框架版本是否与你的VB.NET项目兼容(比如目标DLL基于.NET Framework 4.8,项目不能用.NET 6)。
内容的提问来源于stack exchange,提问作者Gianfranco Vrech
相关产品推荐
相关产品推荐

