问题描述
对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个问题:
- 需要忽略resources即资源文件,它们是自动生成的
- 对同一个程序集,即使已经加载了,也有可能触发AssemblyResolve事件,对此,需要从已加载程序集中寻找
- 确实没有加载的第三方wpf库,从我们自己选定的dll放置目录中加载(debug阶段,一般在bin文件夹中)
代码示例
做成了一个静态类是因为显然只需要调用一次,使用时放到程序的入口点。需要注意的是,在同一个方法体中,不要与“法2”同时调用有可能引发“Could not load file or assembly(无法加载文件或者程序集)”问题的程序集。因为,同一个方法体执行完了,AssemblyResolve事件才注册成功,执行完之前,AssemblyResolve还未注册成功。
internal static class AssemblyLoader