WPF,Could not load file or assembly(无法加载文件或者程序集)

问题描述

对Revit和AutoCAD进行二次开发时,当使用WPF作可视化展示时,如果引用了第三方的wpf相关的库,时常会遇到类似于“Could not load file or assembly(无法加载文件或者程序集)”的问题

问题分析

进行二次开发时,你所做的只是一个类库项目,真正的执行程序是进行二次开发的对象的exe文件,wpf会在它所在位置寻找需要的dll文件。显然是找不到的。

问题解决

法1

直接将找不到的dll文件扔到Revit或者AutoCAD等二次开发对象的根目录中

法2

引用程序集失败会引发AppDomain的AssemblyResolve事件,该事件的事件参数是ResolveEventArgs,它有一个属性Name记录了加载失败的程序集的FullName(形式为:mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
可以通过字符串操作string.Spiliti(",")[0]或者new AssemblyName(args).Name来获得该程序集的名字,在本例中是“mscorlib”,没有扩展名“.dll”。
值得注意的是,在AssemblyResolve事件的处理函数中,要注意3个问题:

  1. 需要忽略resources即资源文件,它们是自动生成的
  2. 对同一个程序集,即使已经加载了,也有可能触发AssemblyResolve事件,对此,需要从已加载程序集中寻找
  3. 确实没有加载的第三方wpf库,从我们自己选定的dll放置目录中加载(debug阶段,一般在bin文件夹中)

代码示例

做成了一个静态类是因为显然只需要调用一次,使用时放到程序的入口点。需要注意的是,在同一个方法体中,不要与“法2”同时调用有可能引发“Could not load file or assembly(无法加载文件或者程序集)”问题的程序集。因为,同一个方法体执行完了,AssemblyResolve事件才注册成功,执行完之前,AssemblyResolve还未注册成功。

    internal static class AssemblyLoader
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值